【发布时间】:2014-09-08 13:13:59
【问题描述】:
下面我有一个简单的 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 之类的操作时才能访问它们?
【问题讨论】:
-
你为什么要让这些对象不可变?我们是在谈论客户端 JavaScript 吗?然后用户可以改变他想要的任何东西。这种“私有属性”模式被高估了。在编写客户端代码时,您只应考虑两件事:效率和维护成本。从这个角度来看,我认为将初始值放在实例上,将方法放在原型上会更好。可能更高效(取决于对象的数量)并且根据我的经验更易于维护。
-
@freakish:不变性与安全性无关。使用访问器方法(无论是否私有,效率并没有那么不同)通常具有更好的可维护性。使用私有属性可以帮助有许多程序员的项目,或者在编写库时;无论是客户端还是服务器端。
标签: javascript oop prototypal-inheritance