javascript - Object.defineProperty添加一个不可枚举的extend()方法 是什么意思,如何使用?
巴扎黑
巴扎黑 2017-04-10 13:10:29
0
1
766

JavaScript 权威指南136页

//6-3复制属性的特征
/**
*不太理解这个是一个什么,属性。
*添加这extend()方法后能够将该对象的所有属性全部复制过去?而且无法单独独调用,属于默认内容
* stackoverflow的答案也只是说这是个能够全部继承并能够成功调用
* http://stackoverflow.com/questions/7033811/copying-attributes-in-javascript
*那么它什么也不是,就是一个属性罢了?一个能够保证你完全继承一个对象的方法而异
*/

/**
*给Object.defineProperty添加一个不可枚举的extend()方法
*/

Object.defineProperty(Object.prototype,"extend",{
writable:true,
enumerable:false,
configurable:true,
value:function(o){
 var names=Object.getOwnProperyNames(o);
 for(var i=0;i<names.length;i++){
var desc = Object.getOwnPropertyDescriptor(o,name[i]);
Object.defineProperty(this,names[i],desc);
  }
 }
})
巴扎黑
巴扎黑

reply all(1)
洪涛

短答案:你的理解是对的,这个extend就是一个方法,把别的对象的所有属性都复制过来。

长答案:

  • JavaScript基于原型而不是类,所以与其说是继承,不如说是扩展——当然这个只是术语统一问题,小节而已。

  • JavaScript里函数即值,所以方法也是属性。

具体来说:

Object.defineProperty(obj, prop, descriptor)
  • obj 对象
  • prop 属性
  • descriptor 属性描述

你的那段代码中,Object.prototype,JavaScript是基于原型的,Object.prototype是对象的原型,也就是说,这段代码修改了对象原型的属性,因此所有对象都具有了这个extend属性。

extend是属性名称。

然后descriptor部分,value:function (o) ...,就是说extend属性的值是一个函数(JavaScript里函数是值),因为值是函数,所以extend可以叫做方法(method)。这个函数的输入是o,也就是对象,后面的代码就是把对象o的所有的属性复制过来。

writableenumerableconfigurable是关于extend这个属性的一些选项,writable:true就是说这个extend属性可以被赋值,就是说foo.extend = ...的做法是允许的,configurable:true就是说extend的type也可以改,extend也可以删,enumerable:false就是不可枚举,其实这个不加也可以,因为默认就是false,加了更明确一点。

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template