From e1abf373a3c83394f15e3276f391280fc6196066 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 7 Jan 2017 13:31:27 +0800 Subject: [PATCH] docs(object): edit object --- docs/function.md | 20 ++++++++++---------- docs/object.md | 33 +++++++++++++++++++++++---------- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/docs/function.md b/docs/function.md index b7f82ec..b40c10b 100644 --- a/docs/function.md +++ b/docs/function.md @@ -770,7 +770,7 @@ const doSomething = (function () { }()); ``` -## name属性 +## name 属性 函数的`name`属性,返回该函数的函数名。 @@ -779,23 +779,23 @@ function foo() {} foo.name // "foo" ``` -这个属性早就被浏览器广泛支持,但是直到ES6,才将其写入了标准。 +这个属性早就被浏览器广泛支持,但是直到 ES6,才将其写入了标准。 -需要注意的是,ES6对这个属性的行为做出了一些修改。如果将一个匿名函数赋值给一个变量,ES5的`name`属性,会返回空字符串,而ES6的`name`属性会返回实际的函数名。 +需要注意的是,ES6 对这个属性的行为做出了一些修改。如果将一个匿名函数赋值给一个变量,ES5 的`name`属性,会返回空字符串,而 ES6 的`name`属性会返回实际的函数名。 ```javascript -var func1 = function () {}; +var f = function () {}; // ES5 -func1.name // "" +f.name // "" // ES6 -func1.name // "func1" +f.name // "f" ``` -上面代码中,变量`func1`等于一个匿名函数,ES5和ES6的`name`属性返回的值不一样。 +上面代码中,变量`f`等于一个匿名函数,ES5 和 ES6 的`name`属性返回的值不一样。 -如果将一个具名函数赋值给一个变量,则ES5和ES6的`name`属性都返回这个具名函数原本的名字。 +如果将一个具名函数赋值给一个变量,则 ES5 和 ES6 的`name`属性都返回这个具名函数原本的名字。 ```javascript const bar = function baz() {}; @@ -807,13 +807,13 @@ bar.name // "baz" bar.name // "baz" ``` -`Function`构造函数返回的函数实例,`name`属性的值为“anonymous”。 +`Function`构造函数返回的函数实例,`name`属性的值为`anonymous`。 ```javascript (new Function).name // "anonymous" ``` -`bind`返回的函数,`name`属性值会加上“bound ”前缀。 +`bind`返回的函数,`name`属性值会加上`bound `前缀。 ```javascript function foo() {}; diff --git a/docs/object.md b/docs/object.md index 3e849b8..2cd2b4c 100644 --- a/docs/object.md +++ b/docs/object.md @@ -13,7 +13,7 @@ baz // {foo: "bar"} var baz = {foo: foo}; ``` -上面代码表明,ES6允许在对象之中,直接写变量。这时,属性名为变量名, 属性值为变量的值。下面是另一个例子。 +上面代码表明,ES6 允许在对象之中,直接写变量。这时,属性名为变量名, 属性值为变量的值。下面是另一个例子。 ```javascript function f(x, y) { @@ -244,22 +244,35 @@ myObject // Object {[object Object]: "valueB"} 函数的`name`属性,返回函数名。对象方法也是函数,因此也有`name`属性。 ```javascript -var person = { +const person = { sayName() { console.log(this.name); }, - get firstName() { - return "Nicholas"; - } }; person.sayName.name // "sayName" -person.firstName.name // "get firstName" ``` -上面代码中,方法的`name`属性返回函数名(即方法名)。如果使用了取值函数,则会在方法名前加上`get`。如果是存值函数,方法名的前面会加上`set`。 +上面代码中,方法的`name`属性返回函数名(即方法名)。 -有两种特殊情况:`bind`方法创造的函数,`name`属性返回“bound”加上原函数的名字;`Function`构造函数创造的函数,`name`属性返回“anonymous”。 +如果对象的方法使用了取值函数(`getter`)和存值函数(`setter`),则`name`属性不是在该方法上面,而是该方法的属性的描述对象的`get`和`set`属性上面,返回值是方法名前加上`get`和`set`。 + +```javascript +const obj = { + get foo() {}, + set foo(x) {} +}; + +obj.foo.name +// TypeError: Cannot read property 'name' of undefined + +const descriptor = Object.getOwnPropertyDescriptor(o, 'foo'); + +descriptor.get.name // "get foo" +descriptor.set.name // "set foo" +``` + +有两种特殊情况:`bind`方法创造的函数,`name`属性返回`bound`加上原函数的名字;`Function`构造函数创造的函数,`name`属性返回`anonymous`。 ```javascript (new Function()).name // "anonymous" @@ -270,7 +283,7 @@ var doSomething = function() { doSomething.bind().name // "bound doSomething" ``` -如果对象的方法是一个Symbol值,那么`name`属性返回的是这个Symbol值的描述。 +如果对象的方法是一个 Symbol 值,那么`name`属性返回的是这个 Symbol 值的描述。 ```javascript const key1 = Symbol('description'); @@ -283,7 +296,7 @@ obj[key1].name // "[description]" obj[key2].name // "" ``` -上面代码中,`key1`对应的Symbol值有描述,`key2`没有。 +上面代码中,`key1`对应的 Symbol 值有描述,`key2`没有。 ## Object.is()