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

//一些内容均出自 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 -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();
});

你可能感兴趣的:(关于JavaScript中几种创建对象的方式)