javascript对象可以有很多方式来创建。用构造函数或者字面量等。多种的方法构造对象,如何使用,
才能减少大量重复的代码?
基于JavaScript的Object
在JavaScript中,几乎一切都是Object。即使是原始数据类型(除了null和undefined)也被视为Object。
所以可以采用Object来创建对象。
基于Object创建对象类似下面代码:
1 2 3 4 5 6 7 8 9
| var person = new Object(); person.name = "excalibur"; person.email = "lzy7750015@qq.com"; person.sayHi = function(word){ return 'hello '+word; } console.log(person.name); console.log(person.email); console.log(person.sayHi('javascript'));
|
基于字面量(object literal)
基于字面量创建对象非常的简单,使用字面量能省掉不少代码量。
类似下面代码:
1 2 3 4 5 6 7 8 9 10
| var person = { name : "excalibur", email : "lzy7750015@qq.com", sayHi : function(word){ return 'hello '+word; } }; console.log(person.name); console.log(person.email); console.log(person.sayHi('javascript'));
|
使用构造函数
使用构造函数可以创建特定类型的对象,比如原生的Object、Array等。
类似下面代码:
1 2 3 4 5 6 7 8 9 10 11
| function Person(name,email){ this.name = name; this.email = name; this.sayHi = function(word){ return 'hello '+word; } } var person = new Person("excalibur","lzy7750015@qq.com"); console.log(person.name); console.log(person.email); console.log(person.sayHi('javascript'));
|
使用工厂模式
工厂模式是在方法中创建了一个Object的对象来返回创建的对象,创建方式和Object模式一样,
只是多了一层方法的包装。
类似下面代码:
1 2 3 4 5 6 7 8 9 10 11 12 13
| function Person(name, email){ var o = new Object(); o.name = name; o.email = email; o.sayHi = function(word){ return 'hello '+word; } return o; } var person = Person("excalibur", "lzy7750015@qq.com"); console.log(person.name); console.log(person.email); console.log(person.sayHi('javascript'));
|
基于原型
每当我们创建一个对象就会有一个prototype
属性,基于这个prototype
属性扩展的属性或者方法可以在是李总共享。
类似下面代码:
1 2 3 4 5 6 7 8 9 10 11
| function Person(){ } Person.prototype.name = "excalibur"; Person.prototype.email = "lzy7750015@qq.com"; Person.prototype.sayHi = function(word){ return 'hello '+word; } var person = new Person(); console.log(person.name); console.log(person.email); console.log(person.sayHi('javascript'));
|
基于构造函数和原型
基于构造函数可以定义实例属性,原型可以定义共享属性。
类似下面代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function Person(){ this.name = "excalibur"; this.email = "lzy7750015@qq.com"; } Person.prototype = { constructor: Person, sayHi : function (word) { return 'hello '+word; } } var person = new Person(); console.log(person.name); console.log(person.email); console.log(person.sayHi('javascript'));
|
动态原型
在动态原型中,所有信息都放入了构造函数,通过构造函数初始化原有信息。
类似下面代码:
1 2 3 4 5 6 7 8 9 10 11 12 13
| function Person(name, email){ this.name = name; this.email = email; if (typeof this.sayHi != "function"){ Person.prototype.sayHi = function(word){ return 'hello '+word; } } } var person = new Person("excalibur","lzy7750015@qq.com"); console.log(person.name); console.log(person.email); console.log(person.sayHi('javascript'));
|
寄生构造函数
寄生构造函数模式非常类似构造函数创建,它仅仅是在构造函数内声明了一个对象然后返回这个对象,
这个对象就好像寄生于其中。
类似下面代码:
1 2 3 4 5 6 7 8 9 10 11 12 13
| function Person(name, email){ var o = new Object(); o.name = name; o.email = email; o.sayHi = function(word){ return 'hello '+word; }; return o; } var person = new Person("excalibur","lzy7750015@qq.com"); console.log(person.name); console.log(person.email); console.log(person.sayHi('javascript'));
|
稳妥模式
Douglas Crockford 提出的模式,和寄生构造函数基本一样,只是不提供公共属性,方法内也不使用this对象,
创建对象不使用new。
类似下面代码:
1 2 3 4 5 6 7 8 9
| function Person(name, email){ var o = new Object(); o.sayHi = function(word){ return 'hello '+ word +', hello '+ name; }; return o; } var person = Person("excalibur","lzy7750015@qq.com"); console.log(person.sayHi('javascript'));
|
参考文档