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);
}
}
})
短答案:你的理解是对的,这个
extend
就是一个方法,把别的对象的所有属性都复制过来。长答案:
JavaScript基于原型而不是类,所以与其说是继承,不如说是扩展——当然这个只是术语统一问题,小节而已。
JavaScript里函数即值,所以方法也是属性。
具体来说:
你的那段代码中,
Object.prototype
,JavaScript是基于原型的,Object.prototype是对象的原型,也就是说,这段代码修改了对象原型的属性,因此所有对象都具有了这个extend属性。extend
是属性名称。然后descriptor部分,
value:function (o) ...
,就是说extend
属性的值是一个函数(JavaScript里函数是值),因为值是函数,所以extend
可以叫做方法(method)。这个函数的输入是o
,也就是对象,后面的代码就是把对象o的所有的属性复制过来。writable
、enumerable
、configurable
是关于extend
这个属性的一些选项,writable:true
就是说这个extend
属性可以被赋值,就是说foo.extend = ...
的做法是允许的,configurable:true
就是说extend
的type也可以改,extend
也可以删,enumerable:false
就是不可枚举,其实这个不加也可以,因为默认就是false,加了更明确一点。