当我将 F.prototype 放在首字母的外部和内部时,F.prototype 是如何工作的?

问题描述 投票:0回答:1

我正在学习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__
.

javascript prototype
1个回答
0
投票

当一个函数被创建时,它的主体没有被评估,因此当您第一次调用

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)

© www.soinside.com 2019 - 2024. All rights reserved.