创建对象的四种方式

175 阅读1分钟

创建对象方式

一:工厂模式:

创建一个封装函数,函数里创建一个实例object对象,将传进来的值赋值到这个实例对象里,最后将这个对象返回出去。 缺点:没有解决对象识别问题

二:构造函数模式:

创建一个封装函数,用this来赋值。在外部new这个封装函数的实例。 例子:

function Person (age){
  this.age = ae;
  this.sayAge = function(){
    alert(this.name);
}
var person1 = new Person(18);
var person2 = new Person(30);

缺点:构造函数的主要问题是每个方法都要在每个实例上重新创建一遍。如sayAge方法,person1 和person2都有sayAge方法。但是两个方法不是同一个function实例。浪费系统空间

三:原型模式:

创建一个函数,用prototype存值。在外部直接new这个函数的实例。 例子:

function Person(){
  Person.prototype.name = "Davi";
}
var person1 = new Person();
var person2 = new Person();

此时person1、2的prototype都等于Person()的prototype,即原型

可以直接修改person1.name = “king”;来自实例 console出来的person1.name是king,person2.name是Davi。来自原型 这里不是修改了Person.prototype.name 而是查找name的时候会优先查找实例对象的name,找不到便会在原型里搜索name。所以修改不修改原型里的值。

alert("name" in person1 ); true
alert("name" in person2 ); true

alert(person1.hasOwnProperty("name");true
alert(person2.hasOwnProperty("name");false	

小结:in操作符 只要原型有这个属性 不论实例是否有都返回true。 hasOwnProperty()只判断实例是否有该属性,跟原型无关

要加constructor:Person

缺点:如果往person1加东西,person2也同样会被修改

五:组合模式(构造函数+原型模式):

属性用构造函数,方法用原型模式

function Person(age){
  this.age = age;
}
Person.prototype={
  constructor:Person,
  satAge : function(){
    alert(this.age)
  }
}
var person1 = new Person(18);

此模式应用最广泛