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

关于JavaScript中几种创建对象的方式

2014-08-27 00:00 501 查看
摘要: 工厂模式;构造函数模式;原型模式。

//一些内容均出自 Nicholas C.Zakas《Professional JavaScript for Web Developers》
//创建对象方法一
var person = new Object();
person.name = "Nicholas";
person.sayName = function() {
console.log(this.name);
};
//创建对象方法二
var dog = {
name: "Tom",
age: 12,
sayName: function() {
console.log(this.name);
}
};//对象字面量创建对象
//创建对象方法三
function createPig(name, age, job) {
var o = new Object();
o.name = name;
o.age = 11;
o.job = job;
o.sayName = function() {console.log(this.name);};
return o;
};//工厂模式
//创建对象方法四
function Mouse(name, age, job) {
this.name = name;
this.age = 11;
this.job = job;
this.sayName = function() {console.log(this.name);};
};//构造函数模式(函数名大写字母开头)
//创建对象方法五: 原型模式
function Duck(){};
Duck.prototype.name = "Tang";
Duck.prototype.sayName = function() {console.log(this.name)};
var duck = new Duck();
/*
数据属性4个描述行为的特性:用来设置每个属性是否可删除、枚举 遍历、值修改
[[Configurable]]:能否通过delete删除属性
[[Enumerable]]:能否通过for-in循环返回属性
[[Writable]]:能否修改属性的值
[[Value]]包含这个属性的数据值
*/
function DataPropertyModify() {
var cat = {};
//三个参数:属性所在的对象、属性名、描述符对象[其属性是:以上4个特性]
//configurable属性设置为false后不可再次修改
Object.defineProperty(cat, "name", {
configurable: false,
writable: false,
value: "John"
});
console.log(cat.name);
cat.name = "Greg";
console.log(cat.name);
};
/*
访问器属性
[[Configurable]]:能否通过delete删除属性
[[Enumerable]]:能否通过for-in循环返回属性
[[Get]]:读取属性时调用的函数
[[Set]]:写入属性时调用的函数
*/
function constructorPropertyModify() {
var computer = {};
var book = {
//下划线表示只能通过对象方法访问的属性
_year: 2004,
edition: 1
};
Object.defineProperty(book, "year", {
get: function() {
return this._year;
},//只指定getter则该属性不能写
set: function(newValue) {
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue -2004;
}
}
});
book.year = 2005;
console.log(book.edition);

Object.defineProperties(computer, {
_year: {value: 2004},
edition: {value: 1},
year: {
get: function(){return this._year},
set: function(newValue) {
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue&nb
7fe0
sp;-2004;
}
}
},
});
computer.year = 2006;
console.log(computer.edition);
};
function hasPrototypeProperty(object, name) {
return !object.hasOwnProperty(name) && (name in object);
}
domReady(function(){
//当做构造函数使用
var mouse = new Mouse("Tom", 2, "software");
mouse.sayName();
//作为普通函数调用
Mouse("Tom", 2, "software");
window.sayName();
//在另一个对象的作用域中调用
var mo = new Object();
Mouse.call(mo, "Kristen", 25, "Nurse");
mo.sayName();

console.log("开始");
person.sayName();
DataPropertyModify();
constructorPropertyModify();
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: