gpt4 book ai didi

JavaScript 原型(prototype)继承这段代码是否有区别?

转载 作者:行者123 更新时间:2023-11-29 14:48:24 27 4
gpt4 key购买 nike

我有一个关于 JS 原型(prototype)的问题:

如果我有以下构造函数:

function Person(name) {
if (!(this instanceof Person))
return new Person(name);
this.name = name;
}
Person.prototype.sayHello = function() {
console.log("Hello from " + this.name);
}

这里我有一个方法 sayHello 绑定(bind)到 Person 的原型(prototype),它的内存效率更高:

function Person(name) {
if (!(this instanceof Person))
return new Person(name);
this.name = name;
this.sayHello = function() {
console.log("Hello from " + this.name);
}
}

一瞥:

原型(prototype)人物:

enter image description here

非原型(prototype)人:

enter image description here

如您所见,对 sayHello Function 的引用将在所有创建的人中“共享”,而不是仅为每个实例化的人创建一个新的 Function。当 sayHello()那个特定的人。

现在,另一个变体:

function Person(name) {
if (!(this instanceof Person))
return new Person(name);
this.name = name;
this.__proto__.sayHello = function() {
console.log("Hello from " + this.name);
}
}

并且输出与 Person.prototype.sayHello 相同,这意味着 sayHello 在不同的人之间共享。

但这两种方法有区别吗?我猜不是,因为:

Person.prototype === bob.__proto__//true

真的,什么时候应该使用前者(Person.prototype.* 在构造函数外)而不是后者(this.__proto__.* 在构造函数内)函数)?

最佳答案

扩展 Felix 的评论。

版本如下:

this.__proto__.sayHello = function() {
console.log("Hello from " + this.name);
}

不应使用。

每次调用封闭构造函数时,上面的代码也将运行,创建该匿名函数的副本,并覆盖当前保存在原型(prototype)<中的引用.

任何恰好包含对该函数先前实例的引用的代码都将继续指向该旧版本。

在内存效率方面,它与编写 this.sayHello = function(...) 非常相似,因为没有一个实例实际上共享函数的相同副本。在代码效率方面,它可以说更糟糕(尽管等同于使用 Person.prototype.sayHello = ...),因为每次调用都需要在原型(prototype)链上向上移动。

关于JavaScript 原型(prototype)继承这段代码是否有区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29672645/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com