您的位置:首页 > Web前端 > JavaScript

JS设计模式 -原型模式与构造函数

2017-11-28 22:43 288 查看

JS设计模式 - 原型模式与构造函数模式

1. 原型模式

原型模式称为基于现有对象的模板通过克隆来创建对象的模式。

我们可以将原型模式视为基于原型继承,在原型继承中我们创建对象作为其他对象的原型。原型对象本身被有效地用作构造函数创建的每个对象的蓝图。

ECMAScript 5标准中定义的真正的原型继承,需要使用Object.create。为了提醒自己,Object.create创建一个具有指定原型的对象,并且还可以包含指定的属性(例如Object.create( prototype, optionalDescriptorObjects ))。

var myCar = {

name: "Ford Escort",

drive: function () {
console.log( "Weeee. I'm driving!" );
},

panic: function () {
console.log( "Wait. How do you stop this thing?" );
}

};

// Use Object.create to instantiate a new car
var yourCar = Object.create( myCar );

// Now we can see that one is a prototype of the other
console.log( yourCar.name );


Object.create也使我们能够轻松实现高级概念,如差异继承,其中对象能够直接从其他对象继承。我们之前看到,Object.create允许我们使用第二个提供的参数初始化对象属性。例如:

var vehicle = {
getModel: function () {
console.log( "The model of this vehicle is.." + this.model );
}
};

var car = Object.create(vehicle, {

"id": {
value: MY_GLOBAL.nextId(),
// writable:false, configurable:false by default
enumerable: true
},

"model": {
value: "Ford",
enumerable: true
}

});


如果我们希望不直接使用原型模式Object.create,我们可以按照上面的例子模拟模式如下:
var vehiclePrototype = {

init: function ( carModel ) {
this.model = carModel;
},

getModel: function () {
console.log( "The model of this vehicle is.." + this.model);
}
};

function vehicle( model ) {

function F() {};
F.prototype = vehiclePrototype;

var f = new F();

f.init( model );
return f;

}

var car = vehicle( "Ford Escort" );
car.getModel();


Prototype模式的最后一种替代实现可能如下:
var beget = (function () {

function F() {}

return function ( proto ) {
F.prototype = proto;
return new F();
};
})();

2. 原型模式与构造函数模式



构造函数的相关内容请查看 JS原型模式与构造函数模式

上图中构造函数模式的两种属性,实例属性与共有属性,因为构造函数模式如果没有使用prototype方式的话,我们只能叫做这两个名字,所以为了兼容不适用prototype的方式,这里暂且叫做这两个和名字。至于原型模式的话就是自有属性与从原型链上继承而来的属性。


4000
先二者的创建对象的方式不同,原型模式必须拥有prototype的存在,而构造函数方式不必依赖prototype。

第二的是谈一下自己对于二者之间的一些理解吧。就好像在日常开发中这个team中有许多的成员,内部也会有小组。所有的成员相对于team来讲的话,那就是构造函数模式,这里team并不是指某一个个体,而是相当于一个function,我们所有的成员因为这个team工作在一起。在日常开发中,team对于我们的限制其实不大,只有当我们面向整个冻死的时候,才会提到我们的共有属性,某一个team。大部分的时间我们还是坐着自己的事情(实例属性)。

然后我上面有一个leader,我们两个一组,现在这个leader,我就是相当于原型模式,现在这个原型对象就是leader,我在这个组里工作就一定会有一些leader定义的工作方式(继承属性),当然也有一些自己处理问题的方式(自有属性)

这个例子可能不太恰当,更多的理解我认为二者的侧重点不同,尽管看起来没有什么区别。构造函数模式侧重于处理多个对象,只是想要说明这些对象一些共同点,但是不会对于个体有很多的限制。原型模式的侧重点应该是处理较少的对象,需要原型对象与实例对象的紧密联系,会对实例对象有着较多的限制。

note: 不管对于构造函数模式的共有属性,还是原型对象的继承属性,实例对象都是可以重写的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐