--- id: 587d7dae367417b2b2512b7b title: Understand Own Properties challengeType: 1 forumTopicId: 301326 localeTitle: 了解自己的属性 --- ## Description
请看下面的实例,Bird构造函数定义了两个属性:namenumLegs: ```js function Bird(name) { this.name = name; this.numLegs = 2; } let duck = new Bird("Donald"); let canary = new Bird("Tweety"); ``` namenumLegs被叫做自身属性,因为他们是直接在实例对象上定义的。这就意味着duckcanary这两个对象分别拥有这些属性的独立副本。 事实上,Bird的这些实例都将拥有这些属性的独立副本。 以下的代码将duck里面所有的自身属性都存到一个叫ownProps的数组里面: ```js let ownProps = []; for (let property in duck) { if(duck.hasOwnProperty(property)) { ownProps.push(property); } } console.log(ownProps); // prints [ "name", "numLegs" ] ```
## Instructions
canary对象里面的自身属性添加到ownProps数组里面。
## Tests
```yml tests: - text: "ownProps应该包含'numLegs''name'两个属性的值。" testString: assert(ownProps.indexOf('name') !== -1 && ownProps.indexOf('numLegs') !== -1); - text: 在不使用内置方法Object.keys()的情况下完成这个挑战。 testString: assert(!/Object(\.keys|\[(['"`])keys\2\])/.test(code)); - text: You should solve this challenge without hardcoding the ownProps array. testString: assert(!/\[\s*(?:'|")(?:name|numLegs)|(?:push|concat)\(\s*(?:'|")(?:name|numLegs)/.test(code)); ```
## Challenge Seed
```js function Bird(name) { this.name = name; this.numLegs = 2; } let canary = new Bird("Tweety"); let ownProps = []; // Add your code below this line ```
## Solution
```js function Bird(name) { this.name = name; this.numLegs = 2; } let canary = new Bird("Tweety"); function getOwnProps (obj) { const props = []; for (let prop in obj) { if (obj.hasOwnProperty(prop)) { props.push(prop); } } return props; } const ownProps = getOwnProps(canary); ```