对象的创建
Posted 逆水行舟,心如止水。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象的创建相关的知识,希望对你有一定的参考价值。
/*
*工厂模式
*
*/
//工厂模式:用函数来封装以特定接口创建对象的细节
function createPerson(name,age,job){ var o = new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name) }; return o; } var person1=createPerson("chenjj",20,"boss"); var person2=createPerson("wangcc",18,"boss");
//虽然解决了创建多个相似对象的问题,但是没有解决对象识别的问题(即怎么知道一个对象的类型)
/*
*构造函数模式
*
*/
//构造函数模式,
//像object和array这些是原生的构造函数,我们也可以创建自定义的构造函数来实例化,new一个实例。以下面这种方式定义的构造函数是定义在Global对象(在浏览器中是windows对象)中。
function Person(name,age,job){ //构造函数第一个字母要大写, this.name=name; this.age=age; this.job=job; this.sayName=function(){ alert(this.name); }; } var person3=new Person("chenjj",20,"boss"); var person4=new Person("wangcc",18,"boss");//person3和person4这两个实例中都含有constructor(构造函数)这个属性,它指向的是他们的构造函数即Person.
//构造函数的问题:我person3和person4都有一个方法就是sayName这个方法,这两个方法的目的都是一样的,说出自己名字。但是我实例化的时候,person3和person4都是不同的function实例。意思就是虽然我们做的事一样,但我们出生的时候是不一样的。这样会导致不同的作用域链和标识符解析。
//解决的办法就是像下面这样,把方法的定义放到函数外面。这样我person3和person4的方法用的都是同一个函数了。
function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.sayName=sayName; } function sayName(){ alert(this.name); } var person3=new Person("chenjj",20,"boss"); var person4=new Person("wangcc",18,"boss");
//但是,问题又来了,要是我有多个方法呢?岂不是我要定义很多个全局函数?那么,原型模式就出场了。
/*
*原型模式
*
*/
//我们创建的每一个函数都有一个prototype(原型)属性,这是一个指针,指向的是一个对象。这个对象里面包含的是可以由特定类型的所有实例共享的属性和方法。就像上面的Person构造函数,他也有一个prototype属性,这个prototype指向的对象就是Person的实例的原型对象。就是person3和person4的原型对象。
function Person(){}; Person.prototype.name="chenjian"; Person.prototype.age="20"; Person.prototype.job="20"; Person.prototype.sayName=function(){ alert(this.name); }; var person5=new Person(); var person6=new Person();//person5和person6都具有相同的属性和方法,person5.sayName===person6.sayName;
//当我们执行,person5.name的时候会先在person5这个实例中找,有的话就返回name的值,
//没有的话就继续向原型对象中找。
//我们可以用对象字面量来重写原型对象
function Person(){}; Person.prototype={ name:"chenjian", age:"23", job:"boss", sayName:function(){ alert(this.name); } }
//但是我们既然重写了原型对象,那么构造函数和原型对象之间的联系就会改变了,原型对象的constructor属性不再指向原来的Person构造函数了,而是Object构造函数。所以重写整个原型对象,情况就不一样了。
//原型模式也有他的问题,我们知道用原型模式,所有实例都能共享相同的数据。但总得有些属于自己的东西吧。总不可能你这个实例修改了姓名,而其他实例的姓名也迫不得已变的和你一样了吧。
/* * *组合使用构造函数和原型模式 */ function Person(name,age,job){ this.name=name; this.age=age; this.job=job; } Person.prototype={ constructor:Person, sayName:function(){ alert(this.name); } } var person7=new Person("chenjj",23,"boss"); var person8=new Person("wangcc",18,"boss")
//实例的属性都是在构造函数中定义的,你增添和删除你的属性并不影响我下一个实例的创建。而共享的属性和方法则是在原型中定义。
以上是关于对象的创建的主要内容,如果未能解决你的问题,请参考以下文章