155 lines
4.1 KiB
JavaScript
155 lines
4.1 KiB
JavaScript
// var obj = {};
|
||
// obj.name = "xiejie";
|
||
// obj.age = 18;
|
||
// obj.age = "aaaaa";
|
||
|
||
|
||
// console.log(obj.name);
|
||
|
||
|
||
// var obj = {};
|
||
// obj.x = 100;
|
||
|
||
// 接下来我们通过属性描述符的形式来添加属性
|
||
// 属性描述符是一个对象,作为第三个参数传入
|
||
// Object.defineProperty(obj, 'x', {
|
||
// value : 100,
|
||
// writable : false
|
||
// })
|
||
// console.log(obj.x);
|
||
// obj.x = 200;
|
||
// console.log(obj.x);
|
||
|
||
// 获取某一个对象的属性的属性描述符
|
||
// console.log(Object.getOwnPropertyDescriptor(obj, 'x'));
|
||
|
||
// var obj = Object.defineProperty({}, 'x', {
|
||
// value : 100,
|
||
// configurable: true // 禁止配置
|
||
// });
|
||
// obj.x = 5; //试图修改其值
|
||
// console.log(obj.x); //修改失败,返回undefined
|
||
// delete obj.x;
|
||
// console.log(obj.x);
|
||
|
||
// // 包括如果想要重新定义属性描述符也是不可以的
|
||
// Object.defineProperty(obj,'x',{
|
||
// value : 10
|
||
// })
|
||
|
||
// getter 和 setter 示例
|
||
|
||
// var obj = Object.create(Object.prototype, {
|
||
// // 私有属性,不对外
|
||
// _x: { //数据属性
|
||
// value: 1, //初始值
|
||
// writable: true
|
||
// },
|
||
// // 对外的,外部可以访问和修改
|
||
// x: { //访问器属性
|
||
// // 通过 getter 和 setter 访问器来访问和设置属性值,可以做一些限制。
|
||
// get: function () { //getter
|
||
// return this._x; //返回_x属性值
|
||
// },
|
||
// set: function (value) { //setter
|
||
// if (typeof value != "number") {
|
||
// throw new Error('请输入数字');
|
||
// }
|
||
// this._x = value; //赋值
|
||
// }
|
||
// }
|
||
// });
|
||
// console.log(obj.x); // 1
|
||
// obj.x = 100;
|
||
// console.log(obj.x); // 100
|
||
|
||
// obj.x = "2"; //抛出异常
|
||
|
||
// var obj = {
|
||
// _x: 1, // 定义 _x 属性
|
||
// get x() {
|
||
// return this._x
|
||
// }, //定义 x 属性的 getter
|
||
// set x(value) { //定义 x 属性的 setter
|
||
// if (typeof value != "number") {
|
||
// throw new Error('请输入数字');
|
||
// }
|
||
// this._x = value; // 赋值
|
||
// }
|
||
// };
|
||
// console.log(obj.x); //1
|
||
// obj.x = 2;
|
||
// console.log(obj.x); //2
|
||
|
||
|
||
// var obj = {};
|
||
// obj.name = "xiejie";
|
||
// obj.age = 18;
|
||
|
||
// // console.log(Object.getOwnPropertyNames(obj));
|
||
|
||
// console.log(obj.propertyIsEnumerable('name'));
|
||
|
||
// var obj = Object.create(Object.prototype, {
|
||
// _x: { //数据属性
|
||
// value: 1, //初始值
|
||
// writable: true
|
||
// },
|
||
// x: { //访问器属性
|
||
// configurable: true, //允许修改配置
|
||
// get: function () { //getter
|
||
// return this._x; //返回_x属性值
|
||
// },
|
||
// set: function (value) {
|
||
// if (typeof value != "number") {
|
||
// throw new Error('请输入数字');
|
||
// }
|
||
// this._x = value; //赋值
|
||
// }
|
||
// }
|
||
// });
|
||
// var des = Object.getOwnPropertyDescriptor(obj, "x"); //获取属性x的属性描述符
|
||
// console.log(des);
|
||
// des.set = function (value) {
|
||
// //修改属性x的属性描述符set函数
|
||
// //允许非数值型的数字,也可以进行赋值
|
||
// if (typeof value != "number" && isNaN(value * 1)) {
|
||
// throw new Error('请输入数字');
|
||
// }
|
||
// this._x = value;
|
||
// }
|
||
// obj = Object.defineProperty(obj, "x", des);
|
||
// console.log(obj.x); //1
|
||
// obj.x = "2"; //把一个给数值型数字赋值给属性x
|
||
// console.log(obj.x); //2
|
||
|
||
|
||
function extend(toObj, fromObj) { //扩展对象
|
||
for (var property in fromObj) { //遍历对象属性
|
||
if (!fromObj.hasOwnProperty(property)) continue; //过滤掉继承属性
|
||
Object.defineProperty( //复制完整的属性信息
|
||
toObj, //目标对象
|
||
property, //私有属性
|
||
Object.getOwnPropertyDescriptor(fromObj, property) //获取属性描述符
|
||
);
|
||
}
|
||
return toObj; //返回目标对象
|
||
}
|
||
|
||
var obj = {
|
||
name : "xiejie",
|
||
age : 18
|
||
}
|
||
|
||
var obj2 = {};
|
||
Object.defineProperty(obj2,'x',{
|
||
value : 100,
|
||
writable : false,
|
||
enumerable : true
|
||
})
|
||
|
||
extend(obj,obj2);
|
||
console.log(obj);
|
||
obj.x = 200;
|
||
console.log(obj.x);
|