下面,我在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
并按预期工作。我很好奇,尽管将方法属性放在对象的原型上有多正确。规范地讲,我知道实例数据应该与类的实例一起使用,而对象实际使用的方法应该在原型上,但是如果属性本身是方法(例如本例中Base中的名称和部门),情况又如何呢?为了使事物保持不变,我宁愿不要让用户在初始化后更改其中一个对象的属性。在这种情况下,使用原型而不是构造函数向对象添加功能是否有意义?
或者仅将属性放在构造函数中是正确的,这样当您执行诸如Base.prototype.whatever之类的操作时,您就可以访问它们?
最佳答案
属性本身就是方法的情况又如何呢?为了使事物保持不变,我宁愿不要让用户在初始化后更改其中一个对象的属性。
我不再将这些“属性”称为“访问器”或“获取器”方法。
在这种情况下,使用原型而不是构造函数向对象添加功能是否有意义?
是的,如果您指的是类似calculate
的功能。如果您是指诸如name
,department
或number
之类的吸气剂,则需要将它们放置在构造函数中,因为它们需要对config
的特权访问。
规范地说,我知道实例数据应该与类的实例一起使用,并且对象实际使用的方法应该在原型上
实际上有点不同:
实例特定的所有内容(数据,具有不同作用域的访问器方法)都需要进入实例,并且通常在构造函数中进行设置
所有实例之间共享的所有内容(通常是方法,在极少数情况下还包括数据)都应放在原型上。
Concrete.prototype = Base.prototype;
No!改用
Concrete.prototype = Object.create(Base.prototype);
。关于javascript - 属性应该在原型(prototype)上吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25725139/