搜尋

首頁  >  問答  >  主體

javascript - 有關原型鏈的問題

function Shape(){
    this.name='Shape';
    this.toString=function(){
        return this.name;
    };
}

function TwoDShape(){
    this.name='2D shape';
}

function Triangle(side,height){
    this.name='Triangle';
    this.side=side;
    this.height=height;
    this.getArea=function(){
        return this.side*this.height/2;
    };
}

TwoDShape.prototype=new Shape();
Triangle.prototype=new TwoDShape();

var my=new Triangle(5,10);
my.getArea();//25

my.toString();//"Triangle"

1.my.toString()被呼叫時,JavaScript引擎執行路徑是怎麼樣的?

PHP中文网PHP中文网2745 天前725

全部回覆(3)我來回復

  • 滿天的星座

    滿天的星座2017-06-14 10:55:03

    var my=new Triangle(5,10);//[1]
    
    my.getArea();//25 [2]
    
    my.toString();//"Triangle" [3]
    

    [1].建立Triangle實例物件my,

    this.name='Triangle';
    this.side为 5;
    this.height为 10;

    [2] 在Triangle實例物件my上呼叫方法getArea
    [3] 在Triangle實例物件my上呼叫方法toString,發現目前物件上沒有,沿著原型鍊到TwoDShape實例物件上找,還沒有,到Shape實例對像上去找,ok找到。
    此時的this物件為Triangle實例物件my,其上的name屬性值為Triangle,輸出

    回覆
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-06-14 10:55:03

    1:先理解好類型和實例的關係,Shape 是一種類型(抽象),var shape = new Shap(); shape 是一個實例;
    2:問題太含糊,var shape = new Shap(); 與var sh = Shape()的建構器的關係是什麼=》 shape的建構子是Shape.prototype.constructor; (shape和sh怎麼會有關係呢~)
    3:為什麼不直接繼承?設計如此;

    回覆
    0
  • 代言

    代言2017-06-14 10:55:03

    全分開開就知道了,首先看new的操作邏輯,TwoDShape.prototype = new Shape();做了三件事

    TwoDShape.prototype = {};
    TwoDShape.prototype.__proto__ = Shape.prototype;
    Shape.call(TwoDShape.prototype);

    同理

    Triangle.prototype = {};
    Triangle.prototype.__proto__ = TwoDShape.prototype;
    TwoDShape.call(Triangle.prototype);
    var my = {};
    my.__proto__ = Triangle.prototype;
    Triangle.call(my, 5, 10);

    當執行my.toString()的時候從my自身成員開始找toString,沒有就沿著__proto__往上找,最後在my.__proto__.proto__proto__pro prototype)裡找到了toString

    回覆
    0
  • 取消回覆