javascript - объект наследуемого класса может получить доступ ко всем свойствам и методам родителя

1

Мой код:

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?

Теги:
inheritance
prototype

2 ответа

3
Лучший ответ

Это происходит потому, что прототип 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.

  • 0
    Пойми сейчас, спасибо
  • 0
    @Sarmad Добро пожаловать! Я рад, что помог.
0

Прототипное наследование. mercedes = Car = Person. Если вы вызываете метод, javascript ищет текущий объект для этого метода и, если он его не найдет, он поднимается вверх по дереву до тех пор, пока он не сделает или не сделает. В вашем случае он находит это на Человеке.

  • 0
    спасибо, теперь я понимаю, как работает наследование

Ещё вопросы

Сообщество Overcoder
Наверх
Меню