浅析创建javascript对象的方法_.docx

上传人:啊飒飒 文档编号:11556791 上传时间:2021-08-23 格式:DOCX 页数:9 大小:13.61KB
返回 下载 相关 举报
浅析创建javascript对象的方法_.docx_第1页
第1页 / 共9页
浅析创建javascript对象的方法_.docx_第2页
第2页 / 共9页
浅析创建javascript对象的方法_.docx_第3页
第3页 / 共9页
浅析创建javascript对象的方法_.docx_第4页
第4页 / 共9页
浅析创建javascript对象的方法_.docx_第5页
第5页 / 共9页
亲,该文档总共9页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《浅析创建javascript对象的方法_.docx》由会员分享,可在线阅读,更多相关《浅析创建javascript对象的方法_.docx(9页珍藏版)》请在三一文库上搜索。

1、浅析创建javascript对象的方法_ 下面我就为大家带来一篇浅析创建javascript对象的方法。我觉得挺不错的,现在分享给大家,也给大家做个参考。 一、工厂模式 function person (name,age) var p=new Object(); p.name=name; p.age=age; p.showMessage=function() console.log(name:+this.name+ age:+this.age); return p; var p1=person(k1,28); var p2=person(k2,29); console.log(p1.showM

2、essage=p2.showMessage);/false 不是同一个showMessage方法 console.log(p1.constructor);/object 都是object 工厂模式的缺陷是:没解决对象识别的问题,而且每个对象的showMessage方法都不是同一个方法(每个方法在每个对象实例上都重新创建了一遍),增加了开销 二、构造函数模式 function Person (name,age) this.name=name; this.age=age; this.showMessage=function() console.log(name:+this.name+ age:+t

3、his.age); var p1=new Person(k1,28); var p2=new Person(k2,29); console.log(p1.showMessage=p2.showMessage);/false 不是同一个showMessage方法 console.log(p1.constructor);/Person console.log(p1 instanceof Person);/ true 构造函数模式解决了对象识别的问题,但是每个对象的showMessage方法不是同一个方法(每个方法在每个对象实例上都重新创建了一遍),增加了开销 三、原型模式 function Per

4、son () Person.prototype.name =k; Person.prototype.age =29; Person.prototype.showMessage=function () console.log(name:+this.name+ age:+this.age); ; var p1=new Person(); p1.showMessage();/name:k age:29 var p2=new Person(); p2.showMessage();/name:k age:29 console.log(p1.showMessage=p2.showMessage);/ tr

5、ue -引用的是同一函数 console.log(p1.constructor)/Person -对象识别 console.log(p1 instanceof Person)/true -对象识别 console.log(Person.prototype.isPrototypeOf(p1);/ true console.log(Object.getPrototypeOf(p1)=Person.prototype);/ true 原型模式解决了“每个方法在每个对象实例上都重新创建了一遍”的问题,也解决了对象识别的问题 原型模式有个很大的问题是,由于挂载在函数prototype下面的全部对象、变量

6、、函数都是被该函数的全部实例共享的,虽然通过实例p1、p2可以访问到prototype的属性,但是却不能修改属性值,例如p1.name=k1,只是在p1实例上添加了一个name=k1的属性,并没改到prototype.name。假如是值类型还好,假如是引用类型的话,就会有问题了,看如下的例子 function Person () ; Person.prototype.age =10; Person.prototype.array=1,2,3; var p1=new Person(); var p2=new Person(); console.log(p1.array);/ 1,2,3 cons

7、ole.log(p2.array); /1,2,3 p1.array.push(4); console.log(p1.array);/1,2,3,4 console.log(p2.array);/1,2,3,4 p1往array里面添加了值,在p2也反映出来了,由于他们都是指向同一个array 四、组合用法构造函数模式和原型模式 这是最常见的创建对象的方式,结合了构造函数和原型模式的优点 function Person (name,age) this.name=name; this.age=age; Person.prototype.showMessage = function() conso

8、le.log(name:+this.name+ age:+this.age); ; var p1=new Person(k,30); p1.showMessage(); 五、动态原型模式 主要是解决:把全部的信息都封装在构造函数中,更符合oo的思想 function Person (name,age) this.name=name; this.age=age; if(typeof this.showMessage!=function) Person.prototype.showMessage=function() console.log(name:+this.name+ age:+this.a

9、ge); var p1=new Person(k,30); p1.showMessage(); 六、寄生构造函数模式 function Person (name,age) var o=new Object(); o.name=name; o.age=age; o.sayName=function() console.log(this.name); ; return o; var p1=new Person(k,28); p1.sayName(); 寄生构造函数模式和工厂模式是一模一样的,只不过创建对象的时候用法了new 关键字,上例:var p1=new Person(k,28)。 它的主要作

10、用是:在这个构造函数里面进行功能的扩展,例如,我想定义一个数组类型MyArray,它是以Array数组为基础的,有一个自己的方法,如下 function MyArray() var values=new Array(); values.push.apply(values,arguments); /自己定义的方法 values.toPipedString=function() return this.join(|); ; return values; var colors=new MyArray(red,blue,green); console.log(colors.toPipedString(

11、); console.log(colors instanceof Array); 七、稳妥构造函数模式 稳妥构造函数遵循与寄生构造函数类型的模式,但有两点不同:一是不用法this,二是不用法new 调用构造函数 function Person (name,age) var o=new Object(); var tempAge=age; o.name=name; o.age=age; o.sayName=function() console.log(name); o.sayAge=function() console.log(tempAge); return o; var p1=Person(k1,28); p1.sayName(); / k1 p1.sayAge(); / 28 p1.name=k2; p1.age=30; p1.sayName(); / k1 p1.sayAge(); /28 看到如上的输出就很好理解什么叫稳妥对象模式了,就是用这种模式创建的对象,没有其他方法能够转变初始化时候传入的值,这里是Person(k1,28),这样的对象就是稳妥对象,事实上这里用法到就是javascript的闭包了。 以上这篇浅析创建javascript对象的方法就是我分享给大家的全部内容了,盼望能给大家一个参考 .

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1