Мой код:
function Person(firstName) {
"use strict";
this.firstName = firstName;
this.fullName = "ABC";
this.greeting = function (name) {
console.log("Hi " + name);
};
}
Person.prototype.hello = function () {
"use strict";
console.log("Hello");
};
function Car(model, year) {
"use strict";
this.model = model;
this.year = year;
}
Car.prototype = new Person();
var mercedes = new Car("CS300", 2017);
mercedes.greeting("mer");
console.log(mercedes.fullName );
Почему объект Mercedes может получить доступ к свойствам fullName и приветствию метода(), даже если я объявляю их непосредственно в конструкторе Person из Person.prototype?
Это происходит потому, что прототип Car
использует функцию Person
. Итак, когда ключ не найден на mercedes
движке JavaScript, посмотрите, как найти цепочку прототипов, чтобы найти его.
Вы можете получить доступ к объекту прототипа как mercedes.__proto__
, чтобы проверить это. Проверьте следующий фрагмент.
function Person(firstName) {
"use strict";
this.firstName = firstName;
this.fullName = "ABC";
this.greeting = function (name) {
console.log("Hi " + name);
};
}
Person.prototype.hello = function () {
"use strict";
console.log("Hello");
};
function Car(model, year) {
"use strict";
this.model = model;
this.year = year;
}
Car.prototype = new Person();
var mercedes = new Car("CS300", 2017);
console.log(mercedes.__proto__);
Вообще говоря, если JavaScript-движок не найдет ключ, который вы ищете у прото-объекта, то он подходит к прото прото, чтобы найти там ключ. Это происходит до тех пор, пока мы не найдем ключ или не достигнем нулевого значения (конец любой цепи прототипов). Если мы достигнем null
мы получим сообщение о том, что ключ, который мы ищем, не undefined
, поскольку он не был найден нигде в цепочке прототипов. Например, давайте посмотрим, как найти значение ключа foo
для mercedes.
function Person(firstName) {
"use strict";
this.firstName = firstName;
this.fullName = "ABC";
this.greeting = function (name) {
console.log("Hi " + name);
};
}
Person.prototype.hello = function () {
"use strict";
console.log("Hello");
};
function Car(model, year) {
"use strict";
this.model = model;
this.year = year;
}
Car.prototype = new Person();
var mercedes = new Car("CS300", 2017);
console.log(mercedes.foo);
Как вы заметили, теперь undefined
печатается на консоли.
Это называется прототипным наследованием, и это механизм, посредством которого наследование реализуется в JavaScript.
Прототипное наследование. mercedes = Car = Person. Если вы вызываете метод, javascript ищет текущий объект для этого метода и, если он его не найдет, он поднимается вверх по дереву до тех пор, пока он не сделает или не сделает. В вашем случае он находит это на Человеке.