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

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

2014-03-15 16:17 916 查看

1. 数据属性

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

特性。

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

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

这个特性默认值为true。

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

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

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

这个特性默认值为true。

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

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

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

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

性必须是:configurable、enumerable、writable 和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"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐