Javascript 1.9.3 / ECMAScript 5引入了Object。这是Douglas Crockford等人长期以来一直倡导的。我如何在下面的代码替换新的对象。创建?
var UserA = function(nameParam) {
this.id = MY_GLOBAL.nextId();
this.name = nameParam;
}
UserA.prototype.sayHello = function() {
console.log('Hello '+ this.name);
}
var bob = new UserA('bob');
bob.sayHello();
(假设MY_GLOBAL。nextId存在)。
我能想到的最好的是:
var userB = {
init: function(nameParam) {
this.id = MY_GLOBAL.nextId();
this.name = nameParam;
},
sayHello: function() {
console.log('Hello '+ this.name);
}
};
var bob = Object.create(userB);
bob.init('Bob');
bob.sayHello();
似乎没有任何优势,所以我想我没有得到它。我可能太新古典主义了。我应该如何使用Object。创建创建用户“bob”?
与new object相比,使用object. create(…)并没有什么优势。
那些提倡这种方法的人通常会说一些模棱两可的优点:“可伸缩性”,或者“对JavaScript来说更自然”等等。
然而,我还没有看到一个具体的例子来显示这个对象。Create比new有任何优势。相反,它存在一些已知的问题。Sam Elsamman描述了当有嵌套对象并且使用Object.create(…)时会发生什么:
var Animal = {
traits: {},
}
var lion = Object.create(Animal);
lion.traits.legs = 4;
var bird = Object.create(Animal);
bird.traits.legs = 2;
alert(lion.traits.legs) // shows 2!!!
这是因为Object.create(…)提倡使用数据创建新对象的实践;在这里,动物数据成为狮子和鸟原型的一部分,并在共享时引起问题。当使用new时,原型继承是显式的:
function Animal() {
this.traits = {};
}
function Lion() { }
Lion.prototype = new Animal();
function Bird() { }
Bird.prototype = new Animal();
var lion = new Lion();
lion.traits.legs = 4;
var bird = new Bird();
bird.traits.legs = 2;
alert(lion.traits.legs) // now shows 4
至于传递给Object.create(…)的可选属性属性,可以使用Object.defineProperties(…)添加。
你必须创建一个自定义的Object.create()函数。它解决了Crockfords的问题,也调用了init函数。
这是可行的:
var userBPrototype = {
init: function(nameParam) {
this.name = nameParam;
},
sayHello: function() {
console.log('Hello '+ this.name);
}
};
function UserB(name) {
function F() {};
F.prototype = userBPrototype;
var f = new F;
f.init(name);
return f;
}
var bob = UserB('bob');
bob.sayHello();
这里UserB类似于Object。创造,但要适应我们的需要。
如果你愿意,也可以拨打:
var bob = new UserB('bob');
Object的另一种可能用法。Create是用一种廉价而有效的方式克隆不可变对象。
var anObj = {
a: "test",
b: "jest"
};
var bObj = Object.create(anObj);
bObj.b = "gone"; // replace an existing (by masking prototype)
bObj.c = "brand"; // add a new to demonstrate it is actually a new obj
// now bObj is {a: test, b: gone, c: brand}
Notes: The above snippet creates a clone of an source object (aka not a reference, as in cObj = aObj). It benefits over the copy-properties method (see 1), in that it does not copy object member properties. Rather it creates another -destination- object with it's prototype set on the source object. Moreover when properties are modified on the dest object, they are created "on the fly", masking the prototype's (src's) properties.This constitutes a fast an effective way of cloning immutable objects.
这里需要注意的是,这适用于创建后不应该修改的源对象(不可变)。如果源对象在创建后被修改,克隆的所有未屏蔽属性也将被修改。
这里(http://jsfiddle.net/y5b5q/1/)(需要对象。创建功能强大的浏览器)。