Как наследование и прототип цепочки работает в JS - PullRequest
0 голосов
/ 14 ноября 2018

Посмотрите на мой код. Я не понимаю, как это работает

function doSomething() {
  this.testProp = 'testProp';
}

doSomething.testProp1 = "testProp1";
var doSomeInstancing = new doSomething();

console.log("doSomething.testProp:" + doSomething.testProp);
//undefined
console.log("doSomething.testProp1:" + doSomething.testProp1);
//testProp1
console.log(doSomething.hasOwnProperty('testProp1'));
//true 

console.log("doSomeInstancing.testProp:" + doSomeInstancing.testProp);
//testProp
console.log("doSomeInstancing.testProp1:" + doSomeInstancing.testProp1);
//undefined   
console.log(doSomeInstancing.hasOwnProperty('testProp1'));
//false

Вопрос в том, почему testProp не определен в doSomething, а не в doSomeInstancing и наоборот для testProp1.

1 Ответ

0 голосов
/ 14 ноября 2018

Здесь вы имеете дело с двумя различными объектами:

функция: doSomething объект: doSomeInstancing

Оба являются объектами, и оба могут иметь свойства.doSomeInstancing - это объект, возвращаемый функцией при вызове new doSomething(), и это то, на что this ссылается в теле функции.Добавление свойств к этому объекту не влияет на другой объект, функцию doSomething.Обратное тоже верно.

Если вы пытаетесь наследовать свойство, вы на самом деле ищете третий объект: doSomething.prototype.Это свойство функций, которое указывает на объект, с которым будут связаны экземпляры.doSomeInstancing будет наследоваться от этого объекта в цепочке прототипов.Например:

function doSomething() {
  this.testProp = 'testProp';
}

doSomething.prototype.testProp1 = "testProp1 value"

let p = new doSomething()

// p's parent in the protoype chain is doSomething.prototype
console.log(Object.getPrototypeOf(p) === doSomething.prototype)

console.log(p.testProp)
console.log(p.testProp1)
...