《Javascript高级程序设计》:创建对象

Posted 卷卷姑娘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Javascript高级程序设计》:创建对象相关的知识,希望对你有一定的参考价值。

工厂模式

 1             function createPerson(name,age, job){
 2                 var o = new Object();
 3                 o.name = name;
 4                 o.age = age;
 5                 o.job = job;
 6                 o.sayName = function(){
 7                     alert(this.name);
 8                 };
 9                 return o;
10             }
11             var person1 = createPerson("Nicholas", 29, "Software Engineer");
12             var person2 = createPerson("Greg", 27, "Doctor");
13             console.log(person1);
14             console.log(person2);

 

优点:解决了创造对象的问题

缺点:没有解决对象识别的问题 (instanceof -> Object)

构造函数模式

 1     function Person(name,age,job){
 2                 this.name = name;
 3                 this.age = age;
 4                 this.job = job;
 5                 this.sayName = function(){
 6                     alert(this.name);
 7                 }
 8             }
 9             var person1 = new Person("Nicholas", 30, "Software Engineer");
10             console.log(person1);
11             person1.sayName();
12             alert(person1.constructor == Person);
13             alert(person1 instanceof Object);
14             alert(person1 instanceof Person);

 

优点:解决对象识别的问题 (instanceof -> Object)

缺点:不同实例上的同名函数是不相等的。有this对象在,没有必要在执行代码前把函数绑定到特定的对象上来。

原型模式

 1     function Person(){}
 2                 Person.prototype.name = "Nicholas";
 3                 Person.prototype.age = 29;
 4                 Person.prototype.job = "software Engineer";
 5                 Person.prototype.sayName = function(){
 6                     alert(this.name);
 7             }
 8             
 9             var person1 = new Person();
10             person1.sayName();
11             
12             var person2 = new Person();
13             person2.sayName();
14             
15             alert(person1.sayName == person2.sayName);

 

优点:不同实例上的同名函数是相等的

缺点:引用对象的值是所有实例共享的,不存在自己独特的属性

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

 1         function Person(name, age, job){
 2                 this.name = name;
 3                 this.age = age;
 4                 this.job = job;
 5                 this.friends = ["Shelby","Count"];
 6             }
 7             Person.prototype = {
 8                 constructor : Person,
 9                 sayName : function(){
10                     alert(this.name);
11                 }
12             }
13             var person1 = new Person("Nicholas", 29, "Software Engineer");
14             var person2 = new Person("Greg", 27, "Doctor");
15             
16             person1.friends.push("Van");
17             alert(person1.friends);   //S,C,V
18             alert(person2.friends);    //S,C
19             alert(person1.friends  === person2.friends);  // false
20             alert(person1.sayName  === person2.sayName);  //true

 

优点:同时具有构造函数模式和原型模式的优点

缺点:

动态原型模式

        function Person(name, age, job){
                this.name = name;
                this.age = age;
                this.job = job;
                if(typeof this.sayName != "function"){
                    Person.prototype.sayName = function(){
                        alert(this.name);
                    };
                }
            }
            var friend = new Person ("Nicholas", 29, "Software Engineer");
            friend.sayName();

 

只在sayName() 方法不存在的情况下,才会将它添加的原型中。这段代码只会在初次调用构造函数时才会执行。

寄生构造函数模式

function SpecialArray() {
            var values = new Array();
            values.push.apply(values, arguments);
            
            values.toPipedString = function(){
                return this.join("|");
                
            };
            return values;
        }
        
        var colors = new SpecialArray("red", "blue", "green");
        alert(colors.toPipedString());        

 

首先,返回的对象与构造函数或者构造函数与原型属性之间没有关系;也就是说,构造函数返回对象与构造函数外部创建的对 象没有什么不同。为此不能依赖instanceof操作符来确定对象类型。建议能用其他模式的情况下,不要使用这种模式。

稳妥构造函数模式

    function Person(name, age, job){
            var o = new Object();
            //可以在这里自定义私有变量和函数
            o.sayName = function(){
                alert(name);
            };
            return o;
        }
    

 

以上是关于《Javascript高级程序设计》:创建对象的主要内容,如果未能解决你的问题,请参考以下文章

创建对象《JavaScript高级程序设计》

《javascript高级程序设计》学习笔记 | 8.1.理解对象

《javascript高级程序设计》学习笔记 | 9.1.代理基础

JavaScript高级程序设计: 关键字With的使用

《Javascript高级程序设计》:创建对象

理解对象《JavaScript高级程序设计》