我正在学习F.prototype throw this site。玩了一会儿后,我在试图理解
prototype
时感到困惑。首先,让我展示一下我的例子:
let animal = {
jump: function () {
alert(`Hey ${this.name}, Bounce! Bounce! Bounce!`);
}
}
let SlimZ1 = function (name) {
this.name = name;
};
// I tried to import function from animal to SlimZ1 by this
SlimZ1.prototype = {
...animal,
constructor: SlimZ1
}
// And every time when I created an instance, it works fine.
let s1 = new SlimZ1("Lili")
s1.jump() // work
s1.__proto__ === SlimZ1.prototype // true because it equals {jump: ƒ, constructor: ƒ}
现在我试着像这样把
prototype
放在函数里面
let animal = {
jump: function () {
alert(`Hey ${this.name}, Bounce! Bounce! Bounce!`);
}
}
let SlimZ2 = function SlimZ2(name) {
this.name = name;
SlimZ2.prototype = {
...animal,
constructor: SlimZ2
}
};
// And every time when I created an instance, it works fine.
let s2 = new SlimZ2("Lili")
s2.jump() // STOP WORKING
s2.__proto__ === SlimZ2.prototype // false
// s2.__proto__ | {constructor: ƒ}
// SlimZ2.prototype | {jump: ƒ, constructor: ƒ}
教程说调用 new F() 时会复制 F.prototype。但在我的例子的第二种情况下,它没有。谁能帮我解释一下这个问题?
P/s:我知道我们可以使用不同的方式将
prototype
带入 F() 构造函数,使用 Object.assign
或 this.__proto__
.
当一个函数被创建时,它的主体没有被评估,因此当您第一次调用
SlimZ2.prototype
时,对new
的赋值没有任何效果:
let SlimZ2 = function SlimZ2(name) {
this.name = name;
SlimZ2.prototype = {
X: 'hey',
constructor: SlimZ2
}
};
let s2 = new SlimZ2("Lili")
console.log(s2.X)
let s3 = new SlimZ2("Lili")
console.log(s3.X)