Javascript 中创建自定义对象--window

Javascript 中创建对象,可以有很多种方法。

一、Object构造函数/对象字面量:

抛开设计模式不谈,使用最基本的方法,就是先调用Object构造函数创建一个对象,然后给对象添加属性.

var student = new Object();
    student.name = "xiao ming";
    student.age = 20;
    student.getName = function () {
         alert(this.name);
     }
//输出xiao ming值
student.getName();

熟悉javascript 对象字面量的同学,可以换一种更好的写法,至少看上去更简洁。

var student = {
    name: "xiao hong",
    age: 18,
    getName: function () {
        alert(this.name);
    }
};
//输出xiao ming值
student.getName();

缺点:上面方法有个缺点就是,使用同一个接口创建很多类似的对象时,会产生大量重复的代码。这个应该很容易理解了,函数(方法或者类)一般是用来创建公共的方法,上面的对象创建过程,根本没有函数的影子,所以谈不上什么重用。

原文说明:http://www.jb51.net/article/58184.htm

 

二、工厂模式:

工厂模式 抽象了具体创建对象的过程。就像一个黑盒,你只要调用函数(进入工厂),并且传入相应参数(各种原材料),就会出来一个相应的对象(工厂生产的产品)。工厂模式解决了创建多个相似对象的问题。

function studentFactory(name,age) {
    var student = new Object();
    student.name = name;
    student.age = age;
    student.sayName = function () {
        alert(this.name);
    }
    return student;
}
var p1 = studentFactory("ming", 20);
var p2 = studentFactory("hong", 18);
p1.sayName();
p2.sayName();

结果显示:

ming

hong

缺点:工厂模式也有缺点,最大的缺点就是 对象类型识别的问题。只能判断出对象是Object 类型(p1 instanceof Object),而无法具体判断出来是哪种类型。使用工厂模式创建出来的student 其实都有着类似的属性和方法,只是值不同而已。这时 更好的解决方法是,创建一个Student 函数,这样所有的对象都属于 Student 类型。所以工厂模式不是不好,只是 构造函数模式更优。

原文说明:http://www.jb51.net/article/58184.htm

 

三、自定义类型的构造函数:

构造函数可以用来创建特定类型的对象。

function Student(name,age) {
    this.name = name;
    this.age = age;
    this.sayName = function () {
        alert(this.name);
    }
}
var p3 = new Student("ming", 20);
var p4 = new Student("hong", 18);
alert(p3 instanceof Student); //true //instanceof 用于判断一个变量是否某个对象的实例
alert(p3.sayName==p4.sayName); //false

结果展示:

true

false

缺点:自定义构造函数 的不足之处就是,每个对象都会重新创建自己的方法,其实这些方法功能是一样的(像 sayName),但是它们却不相同(p3.sayName 和p4.sayName不相等)。

原文说明:http://www.jb51.net/article/58184.htm

 

四、原型模式:

定义一个空函数,然后把所有属性和方法都添加到原型上,这样所有的 对象都会共用这些属性和方法。

function Student() {};
Student.prototype.name = "ming";
Student.prototype.age = 20;
Student.prototype.friends = ['qi'];
Student.prototype.sayName = function () {
    alert(this.name);
};


var p5=new Student();
p5.sayName();
alert(p5.name);

结果展示:

ming

ming

缺点:有些属性不能共享,共享回来带来问题,例如:friends。每位同学的friends 大多都不会相同。

原文说明:http://www.jb51.net/article/58184.htm

 

五、构造函数与原型的组合:

function Student(name, age, friends) {
    this.name = name;
    this.age = age;
    this.friends = friends;
}
Student.prototype = {
    constructor: Student,
    sayName: function () {
        alert(this.name);
    }
};
var p6=new Student('chenh');
p6.sayName();

结果展示:

chenh

总结:构造函数与原型的组合 是一种获得广泛认可的创建自定义类型的方法。 也是上面这些方法中的最优方法。

原文说明:http://www.jb51.net/article/58184.htm

例子参照:http://www.jb51.net/article/17551.htm

 

六、动态原型模式:

它是构造函数与原型组合 的一种优化。对于那些共用的属性和方法,如果初始化之后,就不必再重复初始化,提高效率。

function Student(name, age) {
    this.name = name;
    this.age = age;
    if ((typeof this.sayName) != "function") {
        Student.prototype.sayName = function () {
            alert(this.name);
        }
    }
}
var stu = new Student("ming", 20);
alert(stu instanceof Student);
stu.sayName();
var stuNew = new Student("hong", 18);
//alert(stuNew instanceof Student);
stuNew.sayName();

结果展示:

true

ming

hong

当创建多个student对象时,sayName 方法只会初始化一次。

原文说明:http://www.jb51.net/article/58184.htm

 

七、在网上看了很多JavaScript的项目, 用到对象都是采用{}的形式: {}可以算做一个单例(单例模式) 

var Dialog = 
{ 
int : function() { .... }, 
insert : function() { .... }, 
pop : function() { .... } 
}; 
//调用就是: 
Dialog.init(); 

原文说明:http://www.jb51.net/article/28624.htm

 

八、使用function闭包的方式, 感觉使用内部私有成员(函数,变量)更方便:、function(){} 这种返回一个对象。每次都NEW的时候返回都是一个不同的对象! 

function classDialog() 
{ 
var box = "sdfsdf"; //init, insert等函数中调用公共变量就会很方便, 调用内部函数也很方便(如可以直接调用 search()). 

this.init = function() { .... }; 
this.insert = function() { .... }; 
this.pop = function() { .... }; 

function search() { .... } 
} 
var Dialog = new classDialog(); 
Dialog.init(); 

原文说明:http://www.jb51.net/article/28624.htm

 

posted @ 2017-03-30 10:43  chenguiya  阅读(2187)  评论(0)    收藏  举报