看看我的代码。我不明白它的运作方式
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反之亦然。
答案 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)