首頁  >  文章  >  web前端  >  js中一些容易混淆的方法

js中一些容易混淆的方法

高洛峰
高洛峰原創
2016-10-17 09:50:491202瀏覽

JavaScript中有一些名字十分冗長的函數名稱,導致使用時會混亂,特此整理一番,加深印象。

①Object.getOwnPropertyDescriptor     -讀取某個物件特定屬性的屬性描述子(value / writable / enumerable / configurable)

這個方法接受兩個參數:(屬性名稱物件),傳回值是一個物件。

var o = Object.getOwnPropertyDescriptor({x : 1}, 'x');
//{value:1, writable:true, enumerable:true, configurable:true}alert(o);    //  [object Object]

此方法只能取得自身的屬性描述符,無法取得繼承屬性的特性:

var o = Object.getOwnPropertyDescriptor({}, &#39;toString&#39;);<br>
alert(o);     //undefined

②Object.defineProperty  -設定某個物件(單一)屬性的特性或讓新建屬性具有某種特性

這個方法接受三個參數:(要修改的對象, 要建立或修改的屬性、 屬性描述符對象)。

var o = {};
            Object.defineProperty(o, &#39;x&#39;, {
                value : 1,
                writable : true,
                enumerable : false,
                configurable : true
            });
            alert(o.x);   //  1
            
            Object.defineProperty(o, &#39;x&#39;, {writable : false});
            o.x = 2;   //不可行,不会报错,但不会修改, o.x = 1;
            
            Object.defineProperty(o, &#39;x&#39;, {value : 2});
            alert(o.x);   //  2

③Object.defineProperties  ——  設定某個物件(多個)屬性的特性或讓新屬性有某種特性

這個方法接受兩個參數:(修改後的對象, 映射表--包含所有新建或修改屬性的名稱和屬性描述符)。

Object.defineProperties({}, {
                _year : {
                    value : 2016,
            writable : true, 
                    enumerable : true,
                    configurable : true 
                },
                edition : {
                    value : 1
                },
                year : {
                    get : function(){
                        return this._year;
                    },
                    set : function(newValue){
                        if(newValue > 2004){
                            this._year = newValue;
                            this.edition += newValue - 2004;
                        }
                    }
                }
            });

以上在一個空物件中定義了兩個資料屬性(_year和edition),還有一個存取器屬性(year),這裡額屬性都是在同一時間創立。

 

④isPrototypeOf  -確定物件與原型之間存在的關係

function Person(){}            
            var friend = new Person();
            alert(Person.prototype.isPrototypeOf(friend));  //true

因為friend物件內部有一個指向Person.prototype的指針,所以回傳true。

 

⑤Object.getPrototypeOf  -方便取得一個物件的原型

function Person(){}
            Person.prototype.name = &#39;Tom&#39;;
            
            var friend = new Person();
            alert(Object.getPrototypeOf(friend) == Person.prototype);  // true
            alert(Object.getPrototypeOf(friend).name);  // Tom

ES5新增的方法,IE9+支援。

 

⑥hasOwnProperty  ——偵測一個屬性是存在於實例中,還是存在於原型中

function Person(){}
            Person.prototype.name = &#39;Tom&#39;;
            Person.prototype.sayName = function(){
                alert(this.name);
            };
            
            var frient1 = new Person();
            frient1.name = &#39;Jery&#39;;
            var frient2 = new Person();
            
            alert(frient1.hasOwnProperty(&#39;name&#39;));
            alert(frient2.hasOwnProperty(&#39;name&#39;));

使用hasOwnProperty()可以輕鬆知曉存取的是實例屬性還是原型屬性了。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn