js的继承

工厂模式
在工厂模式中,用函数来封装特定接口创建对象。不够灵活,每个对象创建出来都是一样的属性(难以分别对象类型)

function createObj(name,age){
var o={}
o.name=name;
o.age=age;
o.sayName=function(){}
return o;
}
var obj=createObj("huahua",21);

构造函数模式
当new一个构造函数时,主要经以下三步:

  • 以构造器的prototype属性为原型,创建新对象,将引用传给this
  • 通过把带有this的属性和方法添加至对象(实际相当于平常的obj[属性],添加属性,this相当于obj)。
  • 返回this指向新的对象,也就是实例。
    以下例子:that相当this
         var name="哈士奇"
         Dog.prototype.say=function(){
             console.log("wangwanga")
         }
        function Dog(name){
           //1.以构造器的prototype属性为原型,创建新对象,将引用传给that,这是隐式的
            let that=Object.create(Dog.prototype)
           //2.that.name就是为对象添加属性。
            that.name=name;
            that.run=function(){console.log("狗的品种"+this.name)}
           //3.return that 返回that, 在构造函数中也是隐式的
           return that;
        }
        var dog=new Dog("田园犬")
        dog.run();
        dog.say();

上面例子只是讲述了构造器属性是如何赋给实例的,没有讲如何继承了原型上的属性。
手动实现new

  • 先创建一个空对象
  • 将实例的的__proto__赋值到构造函数的prototype
  • 将构造函数的this指向创建的实例。
       function Country(name,place){
           this.name=name;
           this.place=place;
       }
       var china={};
       Country.prototype.sayName=function(){
           console.log(this.name,":"+this.place)
       }
       china.__proto__=Country.prototype;
       Country.call(china,"china","亚洲");
       china.sayName()

js的继承
1.构造函数绑定 使用call或apply绑定构造函数内部this。
缺点:不能够继承Animal的原型

 function Animal(place){
          this.spicies="动物"
          this.place=place
      }
      function Dog(name,place){
          this.name=name;
          改变 Animal内部this指向,并执行(就是new Animal())
          Animal.call(this,place)
      }
      var dog=new Dog("tom","地球")
      console.log(dog)
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值