继承和原型链如何在JS中工作

时间:2018-11-14 15:44:00

标签: javascript prototype-chain

看看我的代码。我不明白它的运作方式

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

问题是,为什么在doSomething中未定义testProp,而在doSomeInstancing中未定义testProp,对于testProp1反之亦然。

1 个答案:

答案 0 :(得分:3)

您在这里处理两个不同的对象:

函数: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)