我正在阅读面向对象的JS,并试图了解基于原型的继承在我的情况下是否最好。我刚读了Eric Elliot关于这种方法优于经典模式here
的帖子在我的情况下,我必须建模一个名为type or class
的{{1}}的10,000个实例。我需要每个对象保持其状态,比如Shape
。使用clone来扩展原型(Eric的帖子中的第二个方法)会导致方法克隆吗?从他的例子来看,
size
在上述情况下,创建10,000个实例会将hello克隆到所有实例中吗?
如果是这样的话,对我来说最好的方法是什么。我的var proto = {
hello: function hello() {
return 'Hello, my name is ' + this.name;
}
};
var george = _.extend({}, proto, {name: 'George'});
拥有10个原始值,并且更多的是充当数据的持有者,而不是抽象行为。要求,
答案 0 :(得分:1)
var george = _.extend({}, proto, {name: 'George'});
在上面的代码中,您使用的是underscore's extend(需要下划线lib)方法。如果您创建这样的对象。
for (var i = 0; i < 1000; i ++) {
var obj = _.extend({}, proto, {name: 'George'});
}
所有1000个对象都是这样的。
{
{name: 'George'},
hello: function hello() {
return 'Hello, my name is ' + this.name;
}
};
但是下面两个方法在所有1000个对象中共享相同的hello函数。所以根据你的意愿选择其中任何一个。
经典方法。
var proto = function (name) {this.name = name || ""};
proto.prototype.hello = function hello() {
return 'Hello, my name is ' + this.name; }
var p2 = new proto({name: "george"});
p2.hello() //"Hello, my name is george"
使用Object.create()
var proto = {
hello: function hello() {
return 'Hello, my name is ' + this.name;
}
};
var p = Object.create(proto, {name: {value: "george"}})
p.hello() //"Hello, my name is george"
在开始使用Object.create之前,您应该清楚了解。它仅在现代浏览器上受支持。以下链接可以帮助您更好地理解