建立对象:浏览器
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); } }