首页 > 代码库 > js关于创建对象的几种模式

js关于创建对象的几种模式

工厂模式:js中是没有类的概念,就通过用函数来封装以特定接口来创建对象,为对象添加属性和方法,然后返回对象,这种模式可以解决创建多个相似对象写大量重复代码的问题,但是它却不能解决对象识别的问题。

function createrPerson(name,age){
                var o = new Object();
                o.name = name;
                o.age = age;
                o.sayName = function(){
                    alert(this.name);
                };
                return o;
            }
            var person1 = new createrPerson("aaa",18);
            var person2 = new createrPerson("bbb",8);
            
            person1.sayName();  
            person2.sayName();

构建函数模式:构造函数可以用来创建特定类型的的对象(原生和自定义),可以向创建内置对象实例一样使用new操作符,此模式可以通过instanceof检测对象类型,这是超过工厂模式的地方,但是它是缺点是构造函数里的方法在每个实例上都会创建一次,因为它的每个成员都无法得到复用。注意这两段代码的区别

function createrPerson(name,age){
                this.name = name;
                this.age = age;
                this.sayName = function(){
                    alert(this.name);
                };
            }
            var person1 = new createrPerson("aaa",18);
            var person2 = new createrPerson("bbb",8);
            
            person1.sayName();  
            person2.sayName();

原型模式:使用构造函数的prototype属性来指定那些应该共享的属性和方法,这样person1和person2实例都共享了同一个sayname方法,所以在最后一行是打印true,

这是与构造函数不同的地方。但是这种模式对于包含有引用类型的属性就有问题了,因为是共享的,如果想改变一个实力的属性,而其他的实力也会随时被更改。

function Person(){}
Person.prototype.name = "aaa";
Person.prototype.age = 18;
Person.prototype.sayName = function(){
alert(this.name);
};

var person1 = new Person();
person1.sayName();
var person2 = new Person();
person2.sayName();
alert(person1.sayName == person2.sayName);

 

 

组合模式:是结合构造函数和原型模式的,使用构造函数定于实力属性,用原型定义共享属性和方法。这样就保证了每个实例都有自己的属性

function Person(name,age){
                this.name = name;
                this.age = age;
                this.friends = ["ccc","ddd"];
            }
            Person.prototype = {
                constructor : Person
                sayName : function(){
                    alert(this.name);
                }
            }
            var person1 = new Person("aaa",12);
            var person2 = new Person("bbb",3);
            person1.friends.push("eee");
            alert(person1.friends);
            alert(person2.friends);
            alert(person1.friends === person2.friends);
            alert(person1.sayName === person2.sayName);

 

 

js关于创建对象的几种模式