18, 对象是怎么样创建的?
答: 1. 用 var obj={} 就可以创建一个对象
2. 用 new Object() 也可以创建一个对象
19,JS 创建对象的方法:
(a) 工厂模式: 用函数来封装以特定接口创建对象的细节.
- function createPerson(name, age, job){
- var o = new Object();
- o.name = name;
- o.age = age;
- o.job = job;
- o.sayName = function(){
- alert(this.name);
- };
- return o;
- }
- var person1 = createPerson("Nicholas", 29, "Software Engineer");
- var person2 = createPerson("Greg", 27, "Doctor");
缺点: 工厂模式虽然解决了创建多个相识对象的问题, 但却没有解决对象识别的问题 (即怎样知道一个对象的类型).
(b) 构造函数模式: ECMAScript 中的构造函数可以用来创建特定类型的对象. 可以创建自定义的构造函数, 从而定义自定义对象类型的属性和方法.
- function Person(name, age, job){
- this.name = name;
- this.age = age;
- this.job = job;
- this.sayName = function(){
- alert(this.name);
- };
- }
- var person1 = new Person("Nicholas", 29, "Software Engineer");
- var person2 = new Person("Greg", 27, "Doctor");
缺点: 使用构造函数的主要问题, 就是每个方法都要在每个实例上重新创建一遍. 不要忘了 --ECMAScript 中的函数是对象, 因此每定义一个函数, 就是实例化一个对象.
(c) 原型模式: 我们创建的每个函数都有一个 prototype(原型) 属性, 这个属性是一个指针, 指向一个对象, 而这个对象的用途是包含可以由特定类型
的所有实例共享的属性和方法. 使用原型对象的好处是可以让所有对象共享它包含的属性和方法
- function Person(){
- }
- Person.prototype.name = "Nicholas";
- Person.prototype.age = 29;
- Person.prototype.job = "Software Engineer";
- Person.prototype.sayName = function(){
- alert(this.name);
- };
- var person1 = new Person();
- person1.sayName(); //"Nicholas"
- var person2 = new Person();
- person2.sayName(); //"Nicholas"
- alert(person1.sayName == person2.sayName); //true
缺点: 原型中所有属性是被很多实例共享的, 这种共享对于函数非常合适. 但是对于引用类型值的属性来说, 问题就比较突出了.
(d) 组合使用构造函数模式和原型模式: 创建自定义类型的最常见方式, 就是使用组合使用构造函数模式和原型模式. 构造函数模式用于定义实例属性,
而原型模式用于定义方法和共享的属性.
- function Person(name, age, job){
- this.name = name;
- this.age = age;
- this.job = job;
- this.friends = ["Shelby", "Court"];
- }
- Person.prototype = {
- constructor: Person,
- sayName : function () {
- alert(this.name);
- }
- };
- var person1 = new Person("Nicholas", 29, "Software Engineer");
- var person2 = new Person("Greg", 27, "Doctor");
- person1.friends.push("Van");
- alert(person1.friends); //"Shelby,Court,Van"
- alert(person2.friends); //"Shelby,Court"
- alert(person1.friends === person2.friends); //false
- alert(person1.sayName === person2.sayName); //true
来源: http://www.qdfuns.com/article/32387/f2afabe20d7cecd94a5463375cc50baf.html