详解js中extend函数

extend详解

为了简化类的声明,可以把派生子类的整个过程包装在一个extend的函数,和其他语言中的extend关键字类似,基于一个给定的类结构创建一个新的类

   function extend(subClass, superClass){
       var F = function(){ };
       F.prototype = superClass.prototype;
       subClass.prototype = new F();
       subClass.prototype.constructor = subClass;
   }

这样和原型链继承中直接使用subClass.prototype = new superClass()有什么区别呢,作为一项改进,它添加了一个空函数F,并将它创建的对象添加进原型链中,这样可以避免产生superClass的新实例,因为它可能比较庞大。下面是extend函数的使用场景:

   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,耦合程度太高,所以我们需要对extend函数做一些改进

   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.contrucotor == 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);

clone函数

与基于类的继承不同,还有一种基于对象的原型式继承,不需要构造函数

   var obj = {
       name: 'sysuzhyupeng',
       say: function(){
          alert(1);
       }
   }
   var newObj = clone(obj);
   newObj.name   // 'sysuzhyupeng'

来看一下clone函数的源码:

    function clone(object){
        function F(){}
        F.prototype = object;
        return new F;
    }

clone函数所返回的是一个以给定对象为原型对象的空对象

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在Pythonextend()函数用于在列表末尾一次性追加另一个序列的多个值,将新的列表扩展到原来的列表。\[1\] 例如,如果有一个列表A = \[1, 2, 3\],我们可以使用A.extend(\[4, 5, 6\])来将\[4, 5, 6\]追加到A的末尾,结果会得到\[1, 2, 3, 4, 5, 6\]。同样,如果有一个列表B = \[\['a', 'b'\]\],我们可以使用B.extend(\['c', 'd', \['e', 'f'\]\])来将\['c', 'd', \['e', 'f'\]\]追加到B的末尾,结果会得到\[\['a', 'b'\], 'c', 'd', \['e', 'f'\]\]。\[1\] 与extend()函数类似的还有append()函数,它用于向列表尾部追加一个新元素,而不是一个序列。append()函数只占一个索引位,并且在原有列表上增加。\[3\] 另外,使用+运算符或+=运算符也可以实现类似的功能,但实际上会生成一个新的列表来存放两个列表的和,只能用于两个列表相加。\[3\] 总结来说,extend()函数用于在列表末尾一次性追加另一个序列的多个值,将新的列表扩展到原来的列表。它与append()函数、+运算符和+=运算符在功能上有所不同,需要根据具体的需求选择使用。\[1\]\[3\] #### 引用[.reference_title] - *1* *3* [pythonextend功能](https://blog.csdn.net/sweet_tea_/article/details/128520677)[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^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [pythonextend功能及用法](https://blog.csdn.net/weixin_43283397/article/details/104292540)[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^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值