创建对象方式
一:工厂模式:
创建一个封装函数,函数里创建一个实例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);
此模式应用最广泛