如何创建对象设计的内容较多,分为2部分
其实创建对象很简单,比如我们创建一个Object对象,也就是Object类型的实例,有2种方法:
这就创建了一个Object对象,这个对象的名字叫person
有点女娲造人的感觉,Object()构造函数就像女娲手里的鞭子,沾上泥水甩一把就创造出来一个人
然后我们给这个person添加一点属性
var person = new Object(); person.name = "ta"; person.age = 92;那么这个人有了名字,叫ta;有了年龄,92
这样也创建了一个对象,对象字面量是对象定义的一种简写形式,目的在于简化创建包含大量属性的对象的过程。
对象字面量也是向函数传递大量可选参数的首选方式。
function displayInfo(args) { var output = ""; if (typeof args.name == "string"){ output += "Name: " + args.name + "\n"; } if (typeof args.age == "number") { output += "Age: " + args.age + "\n"; } alert(output); } displayInfo({ name: "Nicholas", age: 29 }); displayInfo({ name: "Greg" });方括号表示法的优点是可以使用变量访问属性
//比如定义了变量propertyName var propertyName = "name"; var theName = person[propertyName];通常,除非必须使用变量来访问属性,否则我们建议使用点表示法。
属性的英文名叫property,每个property都有4个特性(英文名叫attribute)描述其状态
使用delete
**语法:**delete obj.propertyName 或者 delete obj[propertyName]
**说明:**delete只能删除对象的自有属性,不能删除继承属性。
Object.defineproperty()方法
Object.defineproperty(对象,"属性名",{ configurable:false, eumerable:false, writable:false, value:"修改之后的值" });访问器属性不能直接定义
通过Object.defineProperty()添加访问器 var book = { _year: 2004, edition: 1 }; Object.defineProperty(book, "year", { get: function(){ return this._year; }, set: function(newValue){ if (newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } } }); book.year = 2005; alert(book.edition); //2表示只能通过对象方法访问的属性前面约定俗成地加一个下划线,比如_year
get不带任何参数,必须有return值set只能有一个参数,这个参数就是给这个访问器属性赋的值,任何return都是无效的访问器属性的名称对应set函数的参数不一定非要同时指定 get和 set。只指定 get 意味着属性只读,尝试写入属性会被忽略
通过__defineGetter__()和__defineSetter()__方法 var book = { _year: 2004, edition: 1 }; //定义访问器的旧有方法 book.__defineGetter__("year", function(){ return this._year; }); book.__defineSetter__("year", function(newValue){ if (newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } }); book.year = 2005; alert(book.edition); //2如果希望一个属性值的变化会导致另一个属性值的变化,可以设置访问器属性
使用Object.defineProperties()方法可以同时定义多个属性,包括数据属性和访问器属性
var book = {}; Object.defineProperties(book, { _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; } } } });只能访问属性的一个特性
var descriptor = Object.getOwnPropertyDescriptor(book, "_year"); alert(descriptor.value); //2004 alert(descriptor.configurable); //false可以访问属性的所有特性
var descriptors = Object.getOwnPropertyDescriptor(book);