javascript对象的建立

建立对象:浏览器

var person = new Obejct();
person.name = 'sun';
person.sayName = function(){
    alert(this.name);   //this.name将被解析为person.name
}

对象字面量语法可是当须要建立多个对象时,会产生大量重复的代码:函数

var person = {
    name : 'sun',
    age : 11,
    sayName : function(){
        alert(this.name);
    }
}

工厂模式:用函数来封装特定对象的建立细节this

function createPerson(name, age){
    var p = new Object();
    p.name = name;
    p.age = age;
    p.sayName = function(){
        alert(this.name);
    };
    
    return p;
}

var person1 = createPerson("sun", 13);

问题:没有解决对象识别问题(不能知道对象的类型)。spa

构造函数模式prototype

function Person(name, age){
    this.name = name;
    this.age = age;
    this.sayName = function(){
        alert(this.name);
    };
}

var person1 = new Person("sun",12);

alert(person1.constructor);

1:再也不显示的建立对象指针

2:直接将属性和方法赋值给this对象code

3:没有return语句对象

构造函数模式的问题:每一个方法都要在每一个实例上春心建立一遍。ip

解决这个问题的简单方法——把函数的定义转移到构造函数外部。原型

下面例子中全部对象实例将共享一个全局的函数,函数sayName被调用时,经过this绑定执行环境中的Person对象

function Person(name){
    this.name = name;
    this.sayName = sayName;//指针
}

function sayName(){
    alert(this.name);
}

新问题:若是须要定义多个方法,就要定义多个全局函数。且此方法破坏了新对象类型的封装性。

原型模式:

每一个函数都有一个原型属性:prototype,它是一个指针,指向一个对象。这个对象的用途是:包含特定类型的全部实例共享的属性和方法。

使用原型对象的好处:让全部对象实例共享它所包含的属性和方法。

function Person(){}

Person.prototype.name = 'sun';
Person.prototype.age = 18;
Person.prototype.sayName = function(){
                        alert(this.name);
                  };
                  
var person1 = new Person();
alert(person1.name);    //sun
var person2 = new Person();
alert(person2.name);    //sun
alert(person1.sayName == person2.sayName);    //true,同一个方法

每建立一个函数,就会同时建立他的prototype对象,这个对象也会自动拥有一个constructor属性指向函数自己。

更简单的原型模式:  原型+对象字面量

function Person(){}

Person.prototype = {
    //constructor : Person,
    name : 'sun',
    age : 15,
    job : '...',
    sayName : function(){
        alert(this.name);
    }
};

注意:此时constructor属性不在指向Person。

这种语法的本质:彻底重写了默认的prototype对象,这个对象也会自动得到一个constructor属性,这个constructor指向Object构造函数,

若是constructor真的很重要,能够像上面注释掉的那样,显式的生命constructor

但这个constructor是可枚举的,默认的constructor是不可枚举的,所以能够使用下列方法设置。

(该方式仅适用于兼容ECMAScript5的浏览器)

Object.defineProperty(Person.prototype, "constructor", {
    enumerable : false ;   //不可枚举
    value : Person
});

  

原型模式的问题:prototype中的属性值若是是引用类型,会被全部对象实例共享。

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

    构造函数模式用于定义实例的属性,原型模式用于定义方法和共享的属性。

function Person(name, age){
    this.name = name;
    this.age = age;
    this.friends = ["sun","cheng"];
}

Person.prototype = {
    constructor : Person,
    sayName : function(){
               alert(this.name);
       }
}
相关文章
相关标签/搜索