JS 创建对象(常见的几种方法)

参考 : http://www.jb51.net/article/16366.htm


 //1.工厂模式

function createPerson(name, age, job) {
    var o = {};
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function() {
        alert(this.name);
    };
    return o;
}
var tanya = new Person("tanya", "30", "female");
var ansel = new Person("ansel", "30", "male");
tanya.sayName();
ansel.sayName();

       

/*

*2.构造函数方法

*因为this就表示当前运行时的对象,将构造函数this的作用域指向新对象,

*将当前运行对象的属性和方法都赋给新对象,这样对象模式称为构造函数模式 

*/

function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function() {
        alert(this.name);
    };
}
var tanya = new Person("tanya", "30", "female");
var ansel = new Person("ansel", "30", "male");
tanya.sayName();
ansel.sayName();

//3.原型链

//原型模式就要考虑原型链了,分析一下,sayName方法在实例中被重复定义了两次,

//但其实没有必要创造两个一样的副本。

//使用原型方法,可以使得tanya和ansel的共享一个sayName方法。 

 function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
}
Person.prototype.sayName = function() {
    alert(this.name);
};
var tanya = new Person("tanya", "30", "female");
var ansel = new Person("ansel", "30", "male");
tanya.sayName();
ansel.sayName();

/*4. 实际应用时,不是一成不变的套用某种模式,活学活用。

1)需要共享方法的时候就用原型模式, 

2)需要使用副本的时候就用构造模式,

3)还可以结合起来,把所有信息都封装在构造函数中,而通过在构造函数中初始化原型,

使得对象保持了同时使用构造函数和原型的优点。  */

function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    if (typeof sayName != "function") {
        Person.prototype.sayName = function() {
            alert(this.name);
        };
    }
}
var tanya = new Person("tanya", "30", "female");
var ansel = new Person("ansel", "30", "male");
ansel.sayName = function() {
    alert("Hi ansel, how hansome you are!");
}
tanya.sayName();
ansel.sayName();
tanya.sayName();


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。