js继承的实现 extend

Object.extend =  function (destination, source) {
for (  var property  in source) {
    destination[property] = source[property];
}
return destination;
}
Prototype 对Object类进行的扩展主要通过一个静态函数 Object.extend(destination, source)实现了 JavaScript中的继承。 从语义的角度,  Object.extend(destination, source)方法有些不和逻辑, 因为它事实上仅仅实现了从源对象到目标对象的全息拷贝。不过你也可以这样认为:由于目标对象拥有了所有源对象所拥有的特性, 所以看上去就像目标对象继承了源对象(并加以扩展)一样。另外, Prototype对Object扩展了几个比较有用的静态方法, 所有其他的类可以通过调用这些静态方法获取支持。
JScript code
Object.extend= function(destination, source) {  //  一个静态方法表示继承, 目标对象将拥有源对象的所有属性和方法
for ( var property  in source) {
    destination[property] = source[property];    //  利用动态语言的特性, 通过赋值动态添加属性与方法
}
return destination;    //  返回扩展后的对象
}

Object.extend(Object, { 
inspect:  function(object) {    //  一个静态方法, 传入一个对象, 返回对象的字符串表示
     try {
       if (object == undefined)  return'undefined';  //  处理undefined情况
       if (object == nullreturn'null';      //  处理null情况
       //  如果对象定义了inspect方法, 则调用该方法返回, 否则返回对象的toString()值
       return object.inspect ? object.inspect() : object.toString(); 
    }  catch (e) {
       if (e  instanceof RangeError)  return'...';  //  处理异常情况
       throw e;
    }
},
keys:  function(object) {      //  一个静态方法, 传入一个对象, 返回该对象中所有的属性, 构成数组返回
     var keys = [];
     for ( var property  in object)
      keys.push(property);      //  将每个属性压入到一个数组中
     return keys;
},
values:  function(object) {    //  一个静态方法, 传入一个对象, 返回该对象中所有属性所对应的值, 构成数组返回
     var values = [];
     for ( var property  in object) values.push(object[property]);  //  将每个属性的值压入到一个数组中
     return values;
},
clone:  function(object) {     //  一个静态方法, 传入一个对象, 克隆一个新对象并返回
     return Object.extend({}, object);
}
});
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript中,extend是一个函数,它用于简化类的声明和实现继承。具体地说,extend函数将一个派生子类与一个基类关联起来,创建一个新的类来继承基类的属性和方法。 使用extend函数,可以避免直接使用原型链继承中的"subClass.prototype = new superClass()"这种方式。extend函数在创建派生子类时,添加了一个空函数F,并将F创建的对象添加到原型链中。这样做的好处是避免创建superClass的新实例,因为它可能比较庞大。 下面是extend函数的使用场景示例: ```javascript function Person(name){ this.name = name; } Person.prototype.getName = function(){ return this.name; } function Author(name, books){ // 执行Person构造函数,获得Person对象中的属性 Person.call(this, name); this.books = books; } // 获得Person原型上的方法,实现原型继承 extend(Author, Person); // 在Author原型上继续添加我们需要的方法 Author.prototype.getBooks = function(){ return this.books; } ``` 在这个示例中,通过extend函数将Author类与Person类关联起来,实现了原型继承。通过这种方式,Author类继承了Person类的属性和方法,同时还可以在Author类上添加自己的方法。 此外,还可以对extend函数进行改进,以减少耦合度。改进的extend函数在创建派生子类时,修正了原型的constructor指向,并添加了一个superclass属性,指向基类的原型。这样,可以在派生子类中调用基类的构造函数,实现更灵活的继承关系。 ```javascript function extend(subClass, superClass){ var F = function(){ }; F.prototype = superClass.prototype; subClass.prototype = new F(); subClass.prototype.constructor = subClass; subClass.superclass = superClass.prototype; // 修正原型的constructor指向 if(!superClass.prototype.constructor == Object.prototype.constructor){ superClass.prototype.constructor = superClass; } } // 使用中 function Author(name, books){ // 从superClass.constructor中调用 Author.superclass.constructor.call(this, name) this.books = books; } // 获得Person原型上的方法,实现原型继承 extend(Author, Person); ``` 在这个改进后的示例中,通过extend函数修正了原型的constructor指向,并在派生子类中通过superclass属性调用了基类的构造函数,实现了更灵活的继承关系。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [详解jsextend函数](https://blog.csdn.net/sysuzhyupeng/article/details/54846949)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值