VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 网站开发 > JavaScript >
  • JavaScript教程之js权威指南学习笔记(四)对象(3)

console.log(Object.keys(o)); //返回[]  keys方法,返回所有可枚举的属性 
11
//对属性x进行修改,让它变为只读
12
Object.defineProperty(o, "x", {
13
    writable: false
14
});
15
o.x = 2; //更改属性值
16
console.log(o.x);    //1 没有被更改,属性是只读
17

18
//属性是可配置的,因此可以通过这种方式对它进行修改
19
Object.defineProperty(o, "x", {
20
    value: 2
21
});
22
console.log(o.x);    // 2
23
//将x从数据属性修改为存取器属性
24
Object.defineProperty(o, "x", {
25
    get: function() {
26
        return 0;
27
    }
28
});
29
console.log(o.x);     // 0
30
console.log(Object.getOwnPropertyDescriptor(o, "x"));     //查看x的特性
 
 
如果需要同时修改或创建多个属性,并设置属性描述符,则需要使用Object.defineProperties()。参数一为该对象,参数二为一个映射表。如:
 
 
 
 
1
//首先创建一个空对象,然后给它添加两个数据属性和一个只读存取器属性。
2
var p = Object.defineProperties({}, {
3
    x: {
4
        value: 1,
5
        writable: true,
6
        enumerable: true,
7
        configurable: true
8
    },
9
    y: {
10
        value: 1,
11
        writable: true,
12
        enumerable: true,
13
        configurable: true
14
    },
15
    r: {
16
        get: function() {
17
            return Math.sqrt(this.x * this.x + this.y * this.y)
18
        },
19
        enumerable: true,
20
        configurable: true
21
    }
22
});
 
 
规则:

例子:复制属性的特性
 
 
 
 
1
/*
2
    *给Object.prototype添加一个不可枚举的extend()方法
3
    这个方法继承自调用它的对象,将作为参数传入的对象的属性一一复制
4
    除了值之外,也复制属性的所有特性,除非在目标对象中存在同名的属性
5
    参数对象的所有自有对象(包括不可枚举的属性)也会一一复制
6
*/
7
Object.defineProperty(Object.prototype, "extend", {
8
    writable: true,
9
    enumerable: false,     //不可枚举
10
    configurable: true,
11
    value: function(o) {
12
        var names = Object.getOwnPropertyNames(o);     //得到所有的自有属性,包括不可枚举属性
13
        for (var i = 0; i < names.length; i++) {
14
            if (names[i] in this) {        //如果属性已经存在,则跳过
15
                continue;
16
            }
17
            var desc = Object.getOwnPropertyDescriptor(o, names[i]); //获取o中的属性描述符
18
            Object.defineProperty(this, names[i], desc);    //用它给当前对象(this)创建一个属性
19
        }
20
    }