首页 > 语言 > JavaScript > 正文

浅析创建javascript对象的方法

2024-05-06 14:58:29
字体:
来源:转载
供稿:网友

一、工厂模式

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.showMessage==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:"+this.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 Person () {  }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:29var p2=new Person();p2.showMessage();//name:k age:29console.log(p1.showMessage==p2.showMessage);// true --引用的是同一函数console.log(p1.constructor)//[Person] --对象识别console.log(p1 instanceof Person)//true --对象识别console.log(Person.prototype.isPrototypeOf(p1));// trueconsole.log(Object.getPrototypeOf(p1)==Person.prototype);// true

原型模式解决了“每个方法在每个对象实例上都重新创建了一遍”的问题,也解决了对象识别的问题

原型模式有个很大的问题是,因为挂载在函数prototype下面的所有对象、变量、函数都是被该函数的所有实例共享的,虽然通过实例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]console.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

四、组合使用构造函数模式和原型模式

这是最常见的创建对象的方式,结合了构造函数和原型模式的优点

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选