首页 > 代码库 > js面向对象之:创建对象
js面向对象之:创建对象
最近在学习《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();
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面向对象之:创建对象
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。