原型模式:html
原型模式是指原型实例指向建立对象的种类,并经过拷贝这些原型建立新的对象,是一种用来建立对象的模式,也就是建立一个对象做为另外一个对象的prototype属性;函数
prototype警告:学习了解原型模式前需先学习原型、原型链、prototype、__proto__、constructor等知识;(http://www.javashuo.com/article/p-umuhfijn-ey.html)学习
实现原型模式:this
ES5中的API:Object.create(prototype, optionalDescriptorObjects)spa
Object.create()方法接收两个参数:第一个参数是__proto__对象,第二个是prototiesObject(可选,使用第二个参数能够初始化额外的其余属性,接受字面量对象形式);prototype
var vehiclePrototype = { model:"保时捷", getModel: function () { console.log('车辆模具是:' + this.model); } }; var vehicle = Object.create(vehiclePrototype,{ "model":{ value:"法拉利" } }); vehicle.getModel(); //车辆模具是:法拉利
咱们使用Object.create其实是新建了一个对象vehiclePrototype,而且继承了vehiclePrototype的方法,因此此时vehicle.__proto__ == vehiclePrototype;code
第二个参数中初始化了"model"的值,将model的值初始化为了"法拉利",因此此时新建立的对象vehiclePrototype中只有一个model,值为"法拉利";htm
不用Object.create()实现,用prototype:对象
var vehiclePrototype = { init: function (carModel) { this.model = carModel || "保时捷"; }, getModel: function () { console.log('车辆模具是:' + this.model); } }; function vehicle(model) { function F() { }; F.prototype = vehiclePrototype; var f = new F(); f.init(model); return f; } var car = vehicle('法拉利'); car.getModel(); // 车辆模具是:法拉利
上述代码中,咱们能够看到核心是在vehicle中,咱们先建立了一个新的构造函数,而后将该函数的原型指向vehiclePrototype,而后进行实例化该函数,最后继承以后调用prototype上的init方法,最后将执行结果进行返回也是一样能够实现的;blog
原型模式在JavaScript中无处不在,其余模式中有不少也是基于prototype来实现的,因此好好学习、复习原型和原型链的知识很重要,重点是prototype、__proto__、constructor等关键属性知识点;