您的位置:首页 > Web前端 > JavaScript

JavaScript面向对象(1)

2015-09-23 18:06 751 查看
1.工厂模式

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 p1 = createPerson('zhangsan',23,'writer');
p1.sayName();
2.构造函数模式

function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayHello = sayHello;

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

var p1 = new Person('zhangsan',21,'student');
var p2 = new Person('lisi',22,'writer');


上述代码执行的步骤:

a.创建一个对象

b.将构造函数的作用域赋值给新的对象(因此this指针指向了这个对象)

c.执行构造函数的代码(为这个新对象添加属性)

d.返回新对象

在上述代码的下面添加如下代码,得知,这两个对象都有一个constructor属性,并且该属性指向Person

alert(p1.constructor == Person);  //true

  alert(p2.constructor == Person);  //true

3.通过原型(prototype)创建对象

先了解一些什么prototype的概念,首先它是每个函数都有的属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例

共享的方法和属性。

function Person(){}

Person.prototype.name = 'zhangsan';
Person.prototype.age = 25;
Person.prototype.job = 'student';
Person.prototype.sayName = function(){
alert(this.name);
};

var p1 = new Person();
p1.sayName();   //zhangsan

var p2 = new Person();
p2.sayName();   //zhangsan

alert(p1.sayName == p2.sayName);  //true


4.原型对象

无论在什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype对象,这个属性指向函数的原型对象,。在默认情况下,所有对象

都会自动获得一个constructor属性,这个属性包含指向一个指向prototype属性所在函数的指针。

创建了自定义的构造函数之后,其原型对象默认只会取得constructor的属性,至于其他方法,则都是从Object继承而来。

通过下图,来说明之前通过原型模式创建:



如果我们在实例中定义一个与原型中相同的属性,则原型中的属性会被屏蔽:

p1.name = 'lisi';
alert(p1.name); //lisi

如果我们删除实例中自定义的属性,并不会影响到原型中的属性:

delete p1.name;
alert(p1.name); //zhangsan
如果我们在原型中修改了属性,则所有的实例对象的属性值都会修改:

Person.prototype.name = 'wangwu';
alert(p1.name); //wangwu
alert(p2.name); //wangwu
实例在查找某个属性时,先在自己的环境中查找,找不到的话再去原型对象中查找。

5.通过重写原型对象,创建对象

function Person(){}

Person.prototype = {
constructor:Person,
name:'zhangsan',
age:23,
job:'writer',
sayName:function(){
alert(this.name);
}
};

var p1 = new Person();
p1.sayName();
因为重写了Person函数的prototype对象,所以constructor属性就不再指向Person了,而是指向新对象的constructor属性(指向Object构造函数)。

所以需要我们手动的去指定constructor为Person
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息