码迷,mamicode.com
首页 > Web开发 > 详细

js面向对象之:创建对象

时间:2014-09-24 17:12:57      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   color   io   os   使用   ar   for   

最近在学习《js高级程序设计》,之前所接触的很多的js类库和jQuery插件都会用面向对象的方式来设计,而自己却还是停留在面向方法的阶段,所以今天好好记录一下学习的js创建对象。

 

第一种方式:工厂模式

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 person = createPerson(‘张三‘,23,‘IT‘);
person.sayName();

第二种方式:构造函数模式

function Person(name,age,job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert(this.name);   
    };
}

var person = new Person(‘李四‘,24,‘nothing‘);
var person2 = new Person(‘李四2‘,22,‘nothing‘);
alert(person.sayName == person2.sayName);//false

这种方式创建的对象实例,每一个实例都对应不同的name、age、job属性和sayName方法。

例如上面输出了两个实例的sayName方法是不同的对象。

 

第三种方式:原型模式

function Person(){
}

Person.prototype.name = ‘王五‘;
Person.prototype.age = 25;
Person.prototype.job = ‘nothing‘;
Person.prototype.sayName = function(){
    alert(this.name);
};

也可改进为:

function Person(){ }
Person.prototype = {
name : ‘王五‘,
age : 25,
job : ‘nothing‘,
sayName : function(){ alert(this.name); }

}
var person = new Person();

通过原型创建的属性,则在每一个实例之间共享,有点类似于static的感觉了。

原型的prototype会有一个默认创建的属性:constructor,指向创建prototype的函数的指针,拿前面的例子将就是Person函数。

但是改进后的写法会有不同,Person.prototype.constructor不在指向Person函数了,以为下面的写法等于重写了Prototype为一个Object对象。

alert(person instanceof Person);//true

alert(person instanceof Object);//true

alert(person.constructor == Person);//false

alert(person.constructor == Object);//true

 

如果constructor属性很重要,可以手动指定。

function Person(){ } 
Person.prototype = {
    constructor : Person,
    name : ‘王五‘, 
    age : 25,
    job : ‘nothing‘, 
    sayName : function(){ alert(this.name); }
}

var person = new Person();

 

 

 

bubuko.com,布布扣

var person1 = new Person();

var person2 = new Person();

当person1实例重新定义name时,person1实例的name会改变,而原型中的name值保持不变

person1.name=‘王八蛋‘;

alert(person1.name); //王八蛋

alert(person2.name); //王五

//但是使用delete可删除实例属性,重新访问原型的属性
delete person1.name;
alert(person1.name);//王五

//hasOwnProperty可以检测实例是否有该属性,继承自Object
alert(person1.hasOwnProperty("name"));//false

//in可以检测是否有该属性,不论是实例属性还是原型属性
alert("name" in person1);//true
  

js面向对象之:创建对象

标签:des   style   blog   color   io   os   使用   ar   for   

原文地址:http://www.cnblogs.com/chengzi/p/3990753.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!