国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript深入理解對象方法——Object.create()

melody_lql / 3266人閱讀

摘要:語法新創(chuàng)建對象的原型對象。返回值在指定原型對象上添加新屬性后的對象。例外如果參數(shù)不是或一個對象,則拋出一個異常。是在引入的,且可用。請注意,盡管在中支持設(shè)置為為,但因為那些以前版本限制,此無法支持該特性。

Object.create()

Object.create() 方法會使用指定的原型對象及其屬性去創(chuàng)建一個新的對象。

語法
Object.create(proto[, propertiesObject])

proto
新創(chuàng)建對象的原型對象。

propertiesObject
可選。如果沒有指定為 undefined,則是要添加到新創(chuàng)建對象的可枚舉屬性(即其自身定義的屬性,而不是其原型鏈上的枚舉屬性)對象的屬性描述符以及相應(yīng)的屬性名稱。這些屬性對應(yīng)Object.defineProperties()的第二個參數(shù)。

返回值

在指定原型對象上添加新屬性后的對象。

例外

如果propertiesObject參數(shù)不是 null 或一個對象,則拋出一個 TypeError 異常。

例子 Object.create實現(xiàn)類式繼承

下面的例子演示了如何使用Object.create()來實現(xiàn)類式繼承。這是一個所有版本JavaScript都支持的單繼承。

// Shape - superclass
function Shape() {
  this.x = 0;
  this.y = 0;
}

// superclass method
Shape.prototype.move = function(x, y) {
  this.x += x;
  this.y += y;
  console.info("Shape moved.");
};

// Rectangle - subclass
function Rectangle() {
  Shape.call(this); // call super constructor.
}

// subclass extends superclass
Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;

var rect = new Rectangle();

console.log("Is rect an instance of Rectangle?",
  rect instanceof Rectangle); // true
console.log("Is rect an instance of Shape?",
  rect instanceof Shape); // true
rect.move(1, 1); // Outputs, "Shape moved."

如果你希望能繼承到多個對象,則可以使用混入的方式。

function MyClass() {
     SuperClass.call(this);
     OtherSuperClass.call(this);
}

// inherit one class
MyClass.prototype = Object.create(SuperClass.prototype);
// mixin another
Object.assign(MyClass.prototype, OtherSuperClass.prototype);
// re-assign constructor
MyClass.prototype.constructor = MyClass;

MyClass.prototype.myMethod = function() {
     // do a thing
};

Object.assign 會把 OtherSuperClass原型上的函數(shù)拷貝到 MyClass原型上,使 MyClass 的所有實例都可用 OtherSuperClass 的方法。Object.assign 是在 ES2015 引入的,且可用 polyfilled。要支持舊瀏覽器的話,可用使用 jQuery.extend() 或者 _.assign()。

使用 Object.createpropertyObject參數(shù)
var o;

// 創(chuàng)建一個原型為null的空對象
o = Object.create(null);


o = {};
// 以字面量方式創(chuàng)建的空對象就相當(dāng)于:
o = Object.create(Object.prototype);


o = Object.create(Object.prototype, {
  // foo會成為所創(chuàng)建對象的數(shù)據(jù)屬性
  foo: { 
    writable:true,
    configurable:true,
    value: "hello" 
  },
  // bar會成為所創(chuàng)建對象的訪問器屬性
  bar: {
    configurable: false,
    get: function() { return 10 },
    set: function(value) {
      console.log("Setting `o.bar` to", value);
    }
  }
});


function Constructor(){}
o = new Constructor();
// 上面的一句就相當(dāng)于:
o = Object.create(Constructor.prototype);
// 當(dāng)然,如果在Constructor函數(shù)中有一些初始化代碼,Object.create不能執(zhí)行那些代碼


// 創(chuàng)建一個以另一個空對象為原型,且擁有一個屬性p的對象
o = Object.create({}, { p: { value: 42 } })

// 省略了的屬性特性默認(rèn)為false,所以屬性p是不可寫,不可枚舉,不可配置的:
o.p = 24
o.p
//42

o.q = 12
for (var prop in o) {
   console.log(prop)
}
//"q"

delete o.p
//false

//創(chuàng)建一個可寫的,可枚舉的,可配置的屬性p
o2 = Object.create({}, {
  p: {
    value: 42, 
    writable: true,
    enumerable: true,
    configurable: true 
  } 
});
Polyfill

這個 polyfill 涵蓋了主要的應(yīng)用場景,它創(chuàng)建一個已經(jīng)選擇了原型的新對象,但沒有把第二個參數(shù)考慮在內(nèi)。

請注意,盡管在 ES5 中 Object.create支持設(shè)置為[[Prototype]]null,但因為那些ECMAScript5以前版本限制,此 polyfill 無法支持該特性。

if (typeof Object.create !== "function") {
    Object.create = function (proto, propertiesObject) {
        if (!(proto === null || typeof proto === "object" || typeof proto === "function")) {
            throw TypeError("Argument must be an object, or null");
        }
        var temp = new Object();
        temp.__proto__ = proto;
        if(typeof propertiesObject ==="object")
            Object.defineProperties(temp,propertiesObject);
        return temp;
    };
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/89133.html

相關(guān)文章

  • 深入理解 js 之繼承與原型鏈

    摘要:原型鏈與繼承當(dāng)談到繼承時,只有一種結(jié)構(gòu)對象。如果對該圖不怎么理解,不要著急,繼續(xù)往下看基于原型鏈的繼承對象是動態(tài)的屬性包指其自己的屬性。當(dāng)使用操作符來作用這個函數(shù)時,它就可以被稱為構(gòu)造方法構(gòu)造函數(shù)。 原型鏈與繼承 當(dāng)談到繼承時,JavaScript 只有一種結(jié)構(gòu):對象。每個實例對象(object )都有一個私有屬性(稱之為proto)指向它的原型對象(prototype)。該原型對象也...

    xingqiba 評論0 收藏0
  • 深入理解 JavaScript 原型繼承

    摘要:下面輪到我們的主角原型繼承登場了,它從另一個角度解決了重用的問題。原型繼承的原理原型對象中的由兩部分組成,普通屬性的集合,和原型屬性。原型繼承的實現(xiàn)在上面的例子中,通過直接修改了屬性值,實現(xiàn)了原型繼承。使用原型繼承,同樣可以達(dá)到重用的目的。 繼承的本質(zhì):重用 在探討 JavaScript 的原型繼承之前,先不妨想想為什么要繼承? 考慮一個場景,如果我們有兩個對象,它們一部分屬性相同,另...

    UCloud 評論0 收藏0
  • 深入JavaScript(一)this & Prototype

    摘要:然而事實上并不是。函數(shù)本身也是一個對象,但是給這個對象添加屬性并不能影響。一圖勝千言作者給出的解決方案,沒有麻煩的,沒有虛偽的,沒有混淆視線的,原型鏈連接不再赤裸裸。所以是這樣的一個函數(shù)以為構(gòu)造函數(shù),為原型。 注意:本文章是個人《You Don’t Know JS》的讀書筆記。在看backbone源碼的時候看到這么一小段,看上去很小,其實忽略了也沒有太大理解的問題。但是不知道為什么,我...

    The question 評論0 收藏0
  • JavaScript深入各種繼承

    摘要:通常有這兩種繼承方式接口繼承和實現(xiàn)繼承。理解繼承的工作是通過調(diào)用函數(shù)實現(xiàn)的,所以是寄生,將繼承工作寄托給別人做,自己只是做增強工作。適用基于某個對象或某些信息來創(chuàng)建對象,而不考慮自定義類型和構(gòu)造函數(shù)。 一、繼承的概念 繼承,是面向?qū)ο笳Z言的一個重要概念。通常有這兩種繼承方式:接口繼承和實現(xiàn)繼承。接口繼承只繼承方法簽名,而實現(xiàn)繼承則繼承實際的方法。 《JS高程》里提到:由于函數(shù)沒有簽名,...

    tomlingtm 評論0 收藏0
  • JavaScript深入理解對象方法——Object.entries()

    摘要:返回值給定對象自身可枚舉屬性的鍵值對數(shù)組。描述返回一個數(shù)組,其元素是與直接在上找到的可枚舉屬性鍵值對相對應(yīng)的數(shù)組。屬性的順序與通過手動循環(huán)對象的屬性值所給出的順序相同。借助方法你可以很容易的將轉(zhuǎn)換為你可以使用下面列出的簡易。 Object.entries() Object.entries()方法返回一個給定對象自身可枚舉屬性的鍵值對數(shù)組,其排列與使用 for...in 循環(huán)遍歷該對象時...

    dance 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<