美文网首页
面向对象与原型

面向对象与原型

作者: 水明 | 来源:发表于2018-10-26 11:56 被阅读1次

    对象的原型

    每个对象都含有原型的引用,当查找属性时,若对象本身不具有该属性,则会查找原型上是否有该属性。
    对象的原型是内置属性prototype,无法直接访问。
    Object.setPrototypeOf(o1,o2)将o2设置为o1的原型。
    每个对象可以有一个原型,每个对象的原型也可以拥有一个原型,如此形成原型链。

    对象构造器与原型

    每个函数都有一个原型对象。
    每一个函数的原型都具有一个constructor属性,该属性指向函数本身。
    constructor对象的原型设置为新创建的对象的原型。

    function Bear(){}
    Bear.prototype.eat=()=>console.log('bear is eating!');
    const bro=new Bear();
    bro.eat();
    

    通过构造函数的原型中constructor属性访问对象的构造器。

    function Bear(){}
    const bro=new Bear();
    const dc=new bro.constructor();
    assert(bro instanceof Bear,'bro由Bear构造');
    assert(bro.constructor===Bear,'构造函数的引用');
    assert(dc instanceof Bear,'dc也由Bear构造');
    

    实现继承

    使用Animal的实例作为Bear的原型。

    function Animal(){}
    Animal.prototype.dance=()=>{};
    function Bear(){}
    Bear.prototype=new Animal();
    const bro=new Bear();
    assert(bro instanceof Bear,'bro is a Bear');
    assert(bro instanceof Animal,'and a Animal');
    

    使用关键字class

    class是语法糖,底层仍然是基于原型的实现。
    使用constructor创建构造函数。
    使用static来创建静态函数。

    class Bear{
      constructor(name){
        this.name=name;
        code();
      }
      eat(){
        console.log('eating...');
      }
      static code(){
        console.log('Bear 1926');
      }
    }
    var bro=new Bear('bro');
    

    使用extend实现继承。使用super调用基类构造函数。

    class Animal{
      constructor(name){
        this.name=name;
      }
      dance(){
        console.log(this.name+' is dancing!')
      }
    }
    class Bear extends Animal{
      constructor(name,nick){
        super(name);
        this.nick=nick;
      }
    }
    const bro=new Bear('bro','xhb');
    assert(bro instanceof Animal,'bro is Animal!');
    bro.dance();
    

    相关文章

      网友评论

          本文标题:面向对象与原型

          本文链接:https://www.haomeiwen.com/subject/bzwftqtx.html