javascript复习笔记五----面向对象程序设计(创建对象)

1. 数据属性

 数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有4 个描述其行为的

特性。

[[Configurable]]:表示能否通过delete 删除属性从而重新定义属性,能否修改属性的特

性,或者能否把属性修改为访问器属性。像前面例子中那样直接在对象上定义的属性,它们的

这个特性默认值为true

 [[Enumerable]]:表示能否通过for-in 循环返回属性。像前面例子中那样直接在对象上定

义的属性,它们的这个特性默认值为true

[[Writable]]:表示能否修改属性的值。像前面例子中那样直接在对象上定义的属性,它们的

这个特性默认值为true

 [[Value]]:包含这个属性的数据值。读取属性值的时候,从这个位置读;写入属性值的时候,

把新值保存在这个位置。这个特性的默认值为undefined

要修改属性默认的特性,必须使用ECMAScript 5 的Object.defineProperty()方法。这个方法

接收三个参数:属性所在的对象、属性的名字和一个描述符对象。其中,描述符(descriptor)对象的属

性必须是:configurableenumerablewritable value。设置其中的一或多个值,可以修改

对应的特性值。例如:

var person = {};

Object.defineProperty(person, "name", {

writable: false,

value: "Nicholas"

});

alert(person.name); //"Nicholas"

person.name = "Greg";

alert(person.name); //"Nicholas"


 

创建对象

 

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 person1 = createPerson("Nicholas", 29, "Software Engineer");

var person2 = createPerson("Greg", 27, "Doctor");


 

2、通过构造函数创建对象:

function Person(name, age, job){

this.name = name;

this.age = age;

this.job = job;

this.sayName = sayName;

}

function sayName(){

alert(this.name);

}


var person1 = new Person("Nicholas", 29, "Software Engineer");

var person2 = new Person("Greg", 27, "Doctor");


 

3、原型模式:

function Person(){

}

Person.prototype.name = "Nicholas";

Person.prototype.age = 29;

Person.prototype.job = "Software Engineer";

Person.prototype.sayName = function(){

alert(this.name);

};

var person1 = new Person();

person1.sayName(); //"Nicholas"

var person2 = new Person();

person2.sayName(); //"Nicholas"

alert(person1.sayName == person2.sayName); //true

 

 

function Person(){

}

Person.prototype = {

//在这种方式中,如果想通过构造函数确定对象类型,必须手动指定constructor,否则将指向Object

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

constructor : Person,

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

name : "Nicholas",

age : 29,

job: "Software Engineer",

sayName : function () {

alert(this.name);

}

};


 

 

4、组合使用构造函数模式和原型模式(常用)

function Person(name, age, job){

this.name = name;

this.age = age;

this.job = job;

this.friends = ["Shelby", "Court"];

}

Person.prototype = {

constructor : Person,

sayName : function(){

alert(this.name);

}

}

var person1 = new Person("Nicholas", 29, "Software Engineer");

var person2 = new Person("Greg", 27, "Doctor");

person1.friends.push("Van");

 

alert(person1.friends); //"Shelby,Count,Van"

alert(person2.friends); //"Shelby,Count"

 

alert(person1.friends === person2.friends); //false

alert(person1.sayName === person2.sayName); //true

 

**注意:如果在已经创建了实例的情况下重写原型,那么就会切断现有实例与新原型之间的联系

 

5、动态原型模式

function Person(name, age, job){

//属性

this.name = name;

this.age = age;

this.job = job;

//方法

if (typeof this.sayName != "function"){

Person.prototype.sayName = function(){

alert(this.name);

};

}

}

var friend = new Person("Nicholas", 29, "Software Engineer");

friend.sayName();


 

 

6、寄生构造函数模式(非必须,不要使用)

function SpecialArray(){

//创建数组

var values = new Array();

//添加值

values.push.apply(values, arguments);

//添加方法

values.toPipedString = function(){

return this.join("|");

};

//返回数组

return values;

}

var colors = new SpecialArray("red", "blue", "green");

alert(colors.toPipedString()); //"red|blue|green"


 

7、稳妥构造函数模式(最适合在一些安全的环境中(这些环境中会禁止使用this 和new),或者在防止数据被其他应用程序改动时使用)

 

function Person(name, age, job){

//创建要返回的对象

var o = new Object();

//可以在这里定义私有变量和函数

//添加方法

o.sayName = function(){

alert(name);

};

//返回对象

return o;

}

var friend = Person("Nicholas", 29, "Software Engineer");

friend.sayName(); //"Nicholas"


 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值