Yuming Ren Curious and Learning 平平无奇

Javascript Property

2017-09-16

Javascript Property

Configurable

Seal

属性访问: 如何区分变量为undefined还是不存在?

  1. in in 操作符会检查属性是否在对象及其 [[Prototype]] 原型链中. ```javascript var myObject = { a:2 };

(“a” in myObject); // true (“b” in myObject); // false myObject.hasOwnProperty( “a” ); // true myObject.hasOwnProperty( “b” ); // false


2. hasOwnProperty()
hasOwnProperty(..) 只会检查属性是否在 `myObject` 对象中,不会检查 [[Prototype]] 链。
```javascript
var myObject = { 
	a:2
};

myObject.hasOwnProperty( "a" ); // true
myObject.hasOwnProperty( "b" ); // false

Note: 所有的普通对象都可以通过对于Object.prototype的委托来访问 hasOwnProperty(..), 但是有的对象可能没有连接到Object.prototype(通过 Object. create(null)来创建)。在这种情况下,形如 myObejct.hasOwnProperty(..) 就会失败。这时可以使用一种更加强硬的方法来进行判断:Object.prototype.hasOwnProperty. call(myObject,”a”),它借用基础的 hasOwnProperty(..) 方法并把它显式绑定到 myObject 上。

[[Get]]

[[Put]]

Get Set

getter setter 在 ES5 中可以使用 getter 和 setter 部分改写默认操作,但是只能应用在单个属性上,无法 应用在整个对象上。getter 是一个隐藏函数,会在获取属性值时调用。setter 也是一个隐藏 函数,会在设置属性值时调用。

var myObject = {
// 给 a 定义一个 getter 
	get a() {
		return 2; 
	}
};

Object.defineProperty( 
	myObject, // 目标对象 
	"b", // 属性名
	{
		// 给b设置一个 getter
		get: function(){ return this.a * 2 },

		// 确保b会出现在对象的属性列表中
		enumerable: true
	}
);

myObject.a; // 2

myObject.b; // 4


以上代码只设置了get, 所以对a和b的set操作会被忽略(严格模式报 ReferType Error错)。常见的属性都包含setter和getter 一个常见的设置方法

var myObject = {
// 给 a 定义一个 getter 
	get a() {
		return this._a_; 
	},
// 给 a 定义一个 setter 
	set a(val) {
		this._a_ = val * 2;
	}
};

myObject.a = 2;

console.log(myObject.a); // 4

Tips: a 是在getter 和 setter中定义变量的一个惯例。


上一篇 Javascript this

Comments

Content