gpt4 book ai didi

javascript - 属性应该出现在原型(prototype)上吗?

转载 作者:行者123 更新时间:2023-12-02 17:00:55 25 4
gpt4 key购买 nike

下面我有一个简单的 JavaScript 小继承链:

var Base  =(function(){
function Base(config){
this.name = function(){
return config.name;
}
this.department = function(){
return config.department;
}
}
Base.prototype.calculate = function(){
return this.name().length + this.department().length;
}
return Base;
})();
var base = new Base({
name: 'me',
department: 'this one'
});
console.log(base.calculate());
//inheritance
var Concrete = (function(){
Concrete.prototype = Base.prototype;
function Concrete(config){
Base.apply(this,arguments);
this.number = function(){
return config.number;
}
}
return Concrete;
})();
var concrete = new Concrete({
name: 'concrete',
department: 'the best',
number: 3
});
console.log(concrete.number()); //3
console.log(concrete.name()); //concrete

它按预期工作。不过,我很好奇将方法属性放在对象的原型(prototype)上有多正确。按照规范,我知道实例数据应该与类的实例一起使用,并且对象实际使用的方法应该在原型(prototype)上,但是如果属性本身是方法(例如本例中 Base 中的名称和部门),情况又如何呢?为了保持事物不可变,我不想让用户在初始化这些对象之一后更改它们的属性。在这种情况下,使用原型(prototype)而不是构造函数向对象添加功能是否有意义?

或者只有将属性放在构造函数中才是正确的,以便在执行诸如 Base.prototype.whatever 之类的操作时可以访问它们?

最佳答案

what about the situation where the properties themselves are methods? In the interest of keeping things immutable I'd rather not let users change the properties of one of these objects after they've been initialized.

我不会再称这些“属性”为“访问器”或“ getter ”方法。

In this case does it make any sense to use the prototype instead of the constructor to add functionality to an object?

是的,如果您指的是像 calculate 这样的功能。如果你的意思是像name这样的 setter/getter , departmentnumber需要将它们放在构造函数中,因为它们需要对 config 的特权访问.

Canonically I know that instance data should go with the instance of the class and the methods the object actually uses should be on the prototype

实际上有点不同:

  • 所有特定于实例的内容(数据、具有不同作用域的访问器方法)都需要在实例上进行,并且通常在构造函数中设置
  • 所有实例之间共享的所有内容(通常是方法,但在极少数情况下也包括数据)都应该放在原型(prototype)上。
Concrete.prototype = Base.prototype;

No!使用Concrete.prototype = Object.create(Base.prototype);相反。

关于javascript - 属性应该出现在原型(prototype)上吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25725139/

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