簡體   English   中英

在JavaScript中使用原型繼承的正確方法?

[英]Right way to use Prototypal Inheritance in JavaScript?

當我們在屬性(超類型的數組)中具有引用值時,使用Crockford的方法( http://javascript.crockford.com/prototypal.html )不起作用,因為這在所有對象中都很常見。

那么,在Javascript中沒有問題並且在視覺上更好地封裝對象的所有方法和屬性的真正推薦方法是什么?

例:

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}
var p1 = {name: "nick", friends : ["a1", "a2"]};
var p2 = Object.create(p1);
p2.name ="john";
p2.friends.push("andre");
alert(p1.friends);
alert(p2.friends);
alert(p1.name);
alert(p2.name);

friends數組為p1和p2返回相同的值,而我希望它返回不同的值。

好吧,原型鏈中較高的成員是“共享的”,這就是原型繼承的目標...

但是,您可以將自己的屬性分配給新創建的對象(就像使用name屬性一樣,例如:

var foo = {foo: "xxx", array : ["a1", "a2"]};

var bar = Object.create(foo);
bar.foo = "yyy";
bar.array = ["b1", "b2"];
bar.array.push("bar");

alert(foo.array);   // ["a1", "a2"]
alert(bar.array);    // ["b1, "b2", "bar"]
alert(foo.foo);     // "xxx"
alert(bar.foo);     // "yyy"

最新的瀏覽器版本上提供了標准的 Object.create方法,該方法提供了使用第二個參數創建自己的屬性的方法,例如,您可以:

// ...
var bar = Object.create(foo, {
  foo: { value: 'yyy'},
  array: {value: ["b1", "b2"] }
});
// ...

您能否提供一個不起作用的示例? 原型繼承實際上是用於對象文字的。 如果您試圖修改創建為數組的內容,那么我知道使用繼承的唯一方法就是修改Array.prototype。

暫無
暫無

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

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