美文网首页
js创建对象的七种方法

js创建对象的七种方法

作者: 逆风飘游的鱼 | 来源:发表于2019-08-13 20:54 被阅读0次

    1.工厂模式

    function createPerson(name, age, job){

    var o = new Object();

    o.name = name;

    o.sayName = function(){alert(this.name);};

    return o;

    }

    var person1 = createPerson("Nicholas", 29, "Software Engineer");

    工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)。

    2.构造函数模式

    function Person(name, age, job){

    this.name = name;

    this.sayName = function(){alert(this.name);};

    }

    var person1 = new Person("Nicholas", 29, "Software Engineer");

    在前面的例子中,person1 和 person2 都有一个名为 sayName()的方法,但那两个方法不是同一个 Function 的实例。

    function Person(name, age, job){

    this.name = name;

    this.sayName = sayName;

    }

    function sayName(){alert(this.name);}

    var person1 = new Person("Nicholas", 29, "Software Engineer");

    这样做确实解决了两个函数做同一件事的问题,可是新问题又来了:在全局作用域中定义的函数实际上只能被某个对象调用,这让全局作用域有点名不副实。而更让人无法接受的是:如果对象需要定义很多方法,那么就要定义很多个全局函数,于是我们这个自定义的引用类型就丝毫没有封装性可言了。

    3.原型模式

    function Person(){}

    Person.prototype.name = "Nicholas";

    Person.prototype.sayName = function(){alert(this.name);};

    var person1 = new Person();

    首先,它省略了为构造函数传递初始化参数这一环节,结果所有实例在默认情况下都将取得相同的属性值。虽然这会在某种程度上带来一些不方便,但还不是原型的最大问题。原型模式的最大问题是由其共享的本性所导致的。原型中所有属性是被很多实例共享的,这种共享对于函数非常合适。对于那些包含基本值的属性倒也说得过去,毕竟(如前面的例子所示),通过在实例上添加一个同名属性,可以隐藏原型中的对应属性。然而,对于包含引用类型值的属性来说,问题就比较突出了。来看下面的例子。

    person1.friends.push("Van");

    4.构造函数和原型模式结合

    function Person(name, age, job){

    this.name = name;

    this.friends = ["Shelby", "Court"];

    }

    Person.prototype = {

    constructor : Person,

    sayName : function(){alert(this.name);}

    }

    var person1 = new Person("Nicholas", 29, "Software Engineer");

    创建自定义类型的最常见方式,就是组合使用构造函数模式与原型模式。构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度地节省了内存。另外,这种混成模式还支持向构造函数传递参数;可谓是集两种模式之长。

    5.动态原型模式

    function Person(name, age, job){

    this.name = name;//属性

    if (typeof this.sayName != "function"){

    Person.prototype.sayName = function(){alert(this.name);};//方法

    }

    }

    var friend = new Person("Nicholas", 29, "Software Engineer");

    6.寄生构造函数

    function Person(name, age, job){

    var o = new Object();

    o.name = name;

    o.sayName = function(){alert(this.name);};

    return o;

    }

    var friend = new Person("Nicholas", 29, "Software Engineer");

    7.稳妥构造函数模式

    function Person(name, age, job){

    var o = new Object();//创建要返回的对象

    o.sayName = function(){alert(name);//可以在这里定义私有变量和函数//添加方法};

    return o;//返回对象

    }

    相关文章

      网友评论

          本文标题:js创建对象的七种方法

          本文链接:https://www.haomeiwen.com/subject/lturjctx.html