var felix = inherit(Dude);
felix.name = 'Felix';
使用继承,你可以创建多个继承自同一个对象的子对象,这些子对象可以实时的继承父对象的属性。如下面的代码所示,
复制代码 代码如下:
var garfield = inherit(Dude);//garfield继承自Dude
Dude.walk = function(){//给Dude添加新的方法walk
console.log('Step, step');
};
garfield.walk(); // prints "Step, step"
felix.walk(); // also prints "Step, step"
在inherit函数中使用了基于原型对象的继承
复制代码 代码如下:
function inherit(proto){
if (Object.create){
// 使用ES5中的Object.create方法
return Object.create(proto);
}else if({}.__proto__){
//使用非标准属性__proto__
var ret = {};
ret.__proto__ = proto;
return ret;
}else{
//如果两种都不支持,使用构造函数继承
var f = function(){};
f.prototype = proto;
return new f();
}
}
上面的代码看起来不怎么好,那是因为我们使用了特性监测来判断到底使用3种方式中的哪一种。
但是,怎么使用构造方法呢(也就是,初始化方法)?你该怎么在实例对象之间共享初始化代码呢?在一些情况下,如果你只需要为对象设置一些属性,这时候,初始化函数不是必须的,就像我们上面的例子中那样。但是如果你有更多的初始化代码呢,你也许会制定一个约定,例如:使用一个叫initialize的初始化方法。我们假设在Dude中定义了一个叫initialize的方法,如下
复制代码 代码如下:
var Dude = {
initialize: function(){
this.greetingCount = 0;
},
greet: function(){
console.log('Hello, I am ' + this.name + '.');
this.greetingCount++;
}
}
然后,你可以这样来初始化对象
复制代码 代码如下:
var felix = clone(Dude);
felix.name = 'Felix';
felix.initialize();或者也可以
var felix = { name: 'Felix' };
felix.name = 'Felix';
augment(felix, Dude);
felix.initialize();还可以
var felix = inherit(Dude);
felix.name = 'Felix';
felix.initialize();结语
我表示通过上面定义的三个函数——augment,clone和inherit,你可以对JavaScript中的对象做任何你想做的事,而不必使用构造函数和new关键字。我认为这三个函数所体现的语义更简单并且更接近于JavaScript底层的对象系统。(完)^_^
您可能感兴趣的文章: