@hotjp
2017-03-10T01:26:54.000000Z
字数 2323
阅读 1492
培训
之前有简单介绍过立即执行函数,函数的闭包,简单的对象封装和js中面向对象的实现方式
这次集中横向介绍一下书写环节中对于以上内容的整合
工厂模式是面向对象编程的常见实现模式,用于生产对象和对象实例完成工作需要,减少对外部变量的依赖
之前说过,JavaScript中没有类可以用来实例化对象,所以采用函数返回对象的方式进行对象构建
function createNinjia(name, weapon) {var o = {};o.name = name;o.weapon = weapon;o.sayHello = function() {console.log(name + '向你发射了一把' + weapon);}return o;}
等价于
function createNinjia(name, weapon) {return {name: name,weapon: weapon,sayHello: function() {console.log(name + '向你发射了一把' + weapon);}}}
调用方式
var ninjia = createNinjia('Mike', 'ak47')
但是
工厂模式生产的对象无法识别类型,不能判断生成的源
ninjia // Object {}
function Ninjia(name, weapon) {this.name = name;this.weapon = weapon;this.sayHello = function() {console.log(this.name + '向你发射了一把' + this.weapon);}}
调用方式
var ninjia = new Ninjia('Mike','AK48')
查看一下生成对象
ninjia // Ninjia {}ninjia.constructor // 返回构造函数
构造函数的特性
函数名首写字母为大写
没有显式的创建对象
直接将属性和方法赋值给了this
没有return语句
使用new创建对象
能够识别对象(构造函数模式优于工厂模式的要点)
但是痛点也随之而来,每次构建的对象中有一个重复函数 sayHello
之前认真听原型部分的内容应该已经有完美的解决方案了,但是不要急,我们慢慢过渡
function Ninjia(name, weapon) {this.name = name;this.weapon = weapon;this.sayHello = sayHello;}// ‘萃取’通用部分外置function sayHello() {console.log(this.name + '向你发射了一把' + this.weapon);}
缺点是?
function Ninjia() {}Ninjia.prototype.name = 'Mike';Ninjia.prototype.weapon = 'tutuGun';Ninjia.prototype.sayHello = function() {console.log(this.name + '向你发射了一把' + this.weapon);}
一个纯粹的原型函数进行声明之后,每次对原型的修改都会影响其他函数
var ninjia = new Ninjia()
做一下优化
function Ninjia(name,weapon) {}Ninjia.prototype.name = this.name;Ninjia.prototype.weapon = this.weapon;Ninjia.prototype.sayHello = function() {console.log(this.name + '向你发射了一把' + this.weapon);}
酱紫可以用么?
var ninjia = new Ninjia('Mike','machine gun')
由此开始进入实际开发环节的书写推荐
function Ninjia(name, size, weapon) {this.name = name;this.weapon = weapon;this.size = size;}Ninjia.prototype.sayHello = function() {console.log(this.name + '拿起了他' + this.size + '厘米的' + this.weapon + '冲你来了一发');}var ninjia1 = new Ninjia('Mike', '18','烧火棍'),ninjia2 = new Ninjia('Lilei', '5', '小手枪');
混合模式是适用最普遍最广泛的构建方式
具有构造函数的清晰对象结构
具有原型函数的优秀性能
你以为就到这了?
function Ninjia(name, size, weapon) {this.name = name;this.weapon = weapon;this.size = size;if(typeof this.sayHello != 'function'){console.log('动态初始化原型函数');Ninjia.prototype.sayHello = function() {//this.prototype.sayHello = function() {console.log(this.name + '拿起了他帅气的' + this.size + '厘米的' + this.weapon + '冲你来了一发');}}}
var ninjia1 = new Ninjia('Mike', '18','烧火棍'),ninjia2 = new Ninjia('Lilei', '5', '小手枪');
问题:
声明原型的时候为什么不能用this?
这样写的优势在哪?
随堂附送 《JavaScript高级程序设计》电子版,
也是本文的参考资料,喜欢看纸质书的也可以找我借阅