【问题标题】:defineProperty descriptor Parameter and Object.prototype dilemmadefineProperty 描述符参数和 Object.prototype 的困境
【发布时间】:2017-09-19 07:06:22
【问题描述】:

我正在使用defineProperty创建对象属性,函数中的descriptor参数是否一定需要是object。代码如下:

var config=new Object();
var defineProp = function ( obj, key, value ){
config.value = value; // why should this parameter be an object?
Object.defineProperty( obj, key, config );
};

为什么一定要给Descriptor参数传递一个Object

我有以下两个代码片段,我在其中创建一个构造函数,然后使用它创建对象。这两个代码在控制台中返回相同的输出。使用.prototype.Methodname 会改变什么吗?

1

function Car( model, year, miles ) {
this.model = model;
this.year = year;
this.miles = miles;
}

Car.prototype.toString = function () {
return this.model + " has done " + this.miles + " miles";
};
// Usage:
var civic = new Car( "Honda Civic", 2017, 30000 );

console.log( civic.toString() );

2

function Car( model, year, miles ) {
this.model = model;
this.year = year;
this.miles = miles;
this.toString = function () {
return this.model + " has done " + this.miles + " miles";
};
}

var civic = new Car( "Honda Civic", 2017, 30000 );
console.log( civic.toString() );

代码用法如下:

var civicSport= Object.create( person );

defineProp(civicSport, "topSpeed", "120mph");//function created above
console.log(civicSport);

【问题讨论】:

标签: javascript design-patterns prototype ecmascript-5 defineproperty


【解决方案1】:

descriptor参数指的是正在定义或修改的属性,所以我们需要将其称为键值对(key=正在定义/修改的属性,= 修改或赋值给属性)。因此descriptor 必须是Object

更多详情请见MDN docs

【讨论】:

  • 感谢您的反馈。但是让我们看看这个var driver=new Object; defineProp(driver, "topSpeed", "100mph"); 这里key(topSpeed) 和value(100mph) 是分开传递的,那么为什么要为'Value' 部分传递一个对象呢。
  • 不,我猜你没有正确理解它。我们不能直接改变 'topSpeed' 的值。使用 Object.defineProperty 我们不分配/修改属性的值,而是添加/修改属性“topSpeed”的描述符。而属性描述符键(如'value'、'set'、'get'、'writable')是用于定义属性值的键,因此描述符是一个对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 2017-03-21
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多