/** * 创建一个Object的实例 然后添加属性和方法 **/ var person = new Object(); person.name = "LXK"; person.age = "12"; person.sayAge = function() { return this.age; }; /** * 面向字面量的方法 等价于上面的代码 **/ var person = { name: "LXK", age : "12", sayAge : funtion() { return this.age; } };
ECMAScript 中有两种属性: 数据属性 和访问器属性
数据属性 和访问器属性 不能直接定义 只能通过Object.defineProperty()方法来定义
数据属性包含一个数据值的位置 这个位置可以读取和写入值 数据属性有4钟特性
[[configurable]]: 默认值为true
[[Enumerable]]: 表示能否通过for-in循环返回属性 默认值为true
[[Writable]]:表示能否修改属性的值 默认值为true 默认值为false的时候 表示只读 不可修改
[[Value]]:包含这个属性的数据值 从这个位置读取 和写入保存 默认值为 undefined
var p1 = {
name :"LXK"
};
这个对象的[[Value]]被设置为LXK 这个值得任何修改都将反应在这个位置
修改默认属性必须使用Object.defineProperty(p1, "age", {})方法。三个参数 属性所在的对象 属性名 一个描述符对象 描述符对象的属性必须是:configurable enumerable writable value
var p1 = {}; Object.defineProperty(p1, "name", { writable:false, value:"LXK" }) console.log(p1.name) // "LXK" ; p1.name = "lxk"; console.log(p1.name) //"LXK" //writable:false 表示写入的值只可以读取 不可以修改
以上规则也是用于不可配置属性 (configurable)
var p1 = {}; Object.defineProperty(p1, "name", { configurable: false, value: "LXK"; }); p1.name // "LXK"; delete p1.name // false; p1.name // "LXK";
不可配置属性(configurable)一但被设置为false 就不可以在给变成可配置了 在调用Object.defineProperty()方法修改writable之外的属性都会导致错误
笔记:IE8以上可以使用Object.defineProperty()方法
访问器属性:访问器属性不包含数据值;他们包含一对getter setter 函数(这两个函数不必须) 在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性的时候,会调用setter属性并传入新值,这个函数决定如何处理数据。 访问器属性有四个特性。
[[configurable]]
[[Enumerable]]
[[Get]]:在读取属性时调用的函数 默认值undefined p1.name //"LXK" 读取
[[Set]] :在写入属性时调用的函数 默认值undefined p1.name = "LXK" 写入
var book = { _year : 2004, edition:1 }; Object.defineProperty(book, "year", { get: function(){ return this._year; }, set: function(newYear){ if(newYear > 2004){ this._year = newYear; this.edition += newYear - 2004; } }, }); book.year = 2005; console.log(book.edition);
var book = {}; Object.defineProperties(book,{ _year: { writable: true, value: 2004 }, edition: { writable: true, value: 1 }, year : { get: function(){ return this._year; }, set: function(newYear){
if( newYear > 2004){ this._year = newYear; this.edtion += newYear - 2004; } } } });
Object.defineProperty()