簡體   English   中英

經典結構比原型結構有什么好處?

[英]What are the benefits of a classical structure over a prototyple one?

我最近才開始編程,並且完全是自學成才,遺憾的是我沒有詳細的計算機科學課程的好處。 我最近一直在閱讀很多關於JavaScript的內容,並且我試圖在類中找到JavaScript的原型性質。 這個問題似乎是在一個更好的中間繪制出來的,我希望看到它的經典方面。

當我查看原型示例時:

var inst_a = {
  "X": 123,
  "Y": 321,
  add: function () {
    return this.X+this.Y;
  }
};
document.write(inst_a.add());

然后是經典版

function A(x,y){
  this.X = x;
  this.Y = y;
  this.add = function(){
    return this.X+this.Y;
  };
};
var inst_a = new A(123,321);
document.write(inst_a.add());

我開始考慮這個問題,因為我正在查看新的ecmascript修訂版5,很多人似乎並沒有添加類系統。

當您通過new創建對象時,它將使用它的原型鏈來查找實例中未找到的屬性。

因此,例如,您可以將add方法addA.prototype只需一次,而不是每次創建A的新實例時重新定義相同函數的新副本。

function A(x,y){
  this.X = x;
  this.Y = y;

};
//define add once, instead of every time we create a new 'A'
A.prototype.add = function(){
    return this.X+this.Y;
  };

如果不使用偽造的經典風格,實際上不可能繼承。 看看Douglas Crockford對此有何看法 即使您要使用純粹的原型對象結構,您也必須創建一個用於繼承的構造函數(Crockford會這樣做,然后在create方法后面抽象它,然后將其稱為純粹的原型)

使用第二種方法,您可以創建A實例,允許您一次擁有多個實例。 例如:

var inst_one = new A(123,321);
var inst_two = new A(456,654);

// some meaningful code here...
document.write(inst_one.add());


// some more meaningful code here...
document.write(inst_two.add());

您提供的示例很簡單,所以讓我們構建一個更直觀的示例:

function Comment(user,text){
  this.user = user;
  this.text = text;
  this.toString = function(){
    return '<span class="comment">'+this.text+' - <a class="user">'+this.user+'</a></span>';
  };
};


var comments = someFunctionThatReturnsALotOfCommentObjects();
for(c=0;c<comments.length;c++)
  document.getElementById('comments_container').innerHTML += comments[c].toString();

這(希望)證明了能夠創建類的多個實例的好處。 這不是一個基本的JavaScript概念,它是一個基本的面向對象編程概念,如果你還沒有正式的編程課程,這可能就是你不熟悉它的原因。

公平地說,JavaScript 確實有類。 好吧,也許有些人會爭辯,但我認為這只是頭發的語義分裂。 如果一個類被認為是用於創建對象的藍圖,那么JavaScript函數可以以該容量服務。 這里的功能差別不大 ,只有形式:

class someObj
{
    private int x;
    public int returnX()
    {
        return x;
    }
}
someObj temp = new someObj();

-

function someObj {
    var x;
    this.returnX = function() {
        return x;
    };
}
var temp = new someObj();

在引擎蓋下它們是不同的,但你可以使用任何一種形式來服務於同一目的。

原型在繼承方面確實不同。 在創建新對象時,在原型繼承中,您實際上是在復制原型對象的實例,然后向其中添加新的字段或成員。 另一方面,經典繼承不是處理實例而只是處理“藍圖”。 例如,在JavaScript中你會說:

temp.prototype = new someOtherObj(); //Creating a new instance to serve as the prototype.

用經典語言你可能會說:

class someObj : someOtherObj //Copying the "blue print" over.

這意味着數據將在原型語言中的派生對象之間共享。 我曾經編寫過一個函數,並通過JavaScript中的原型設計從中獲得了另一個函數。 這個基礎對象持有對DOM對象的引用,當我在一個子對象中更改它時,它將為該子對象的所有實例更改它。 這是因為,在原型語言中,您是從實例派生而不是“藍圖”。

經典版本允許您聲明作用於對象“內部”的私有變量,而原型版本則不然。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM