有關js原型的系列方法

最近一直在看js原型,書上講了好多方法,總是弄混淆了,這裏做一個解釋總結,也算對自己學習的一種鞏固

檢測類方法

1.hasOwnProperty()方法

作用: 檢測一個屬性存在於對象實例還是原型中
返回值: 對象實例(true),原型(false)

function Person(age){
    this.age = age;
}
Person.prototype.name = "ys";

var p1 = new Person();
console.log(p1.hasOwnProperty("name"));  //false
console.log(p1.hasOwnProperty("age"));   //true

2.in 操作符

作用:檢測一個屬性是否存在,不管存在於原型還是對象實例
返回值: 有則(true),無則(false),不管屬性的位置

function Person(age){
    this.age = age;
}
Person.prototype.name = "ys";

var p1 = new Person();
console.log("name" in p1);              //true
console.log("age" in p1);               //true
console.log("sex" in p1);               //false

利用這兩個方法結合,可以確定該屬性的位置(對象實例,或者原型)

/*
 * 判斷屬性是存在於對象還是原型
 *
 *  object -> 對象   name -> 要判斷的屬性 
 *  存在於原型中,返回true  存在於對象實例中返回false
 *  
 * */
 function hasPrototypeProperty(object, name){
    return !object.hasOwnProperty(name) && (name in object);
 }

3.isPrototypeOf()方法

作用:用來判斷當前對象是否在傳入的參數對象的原型鏈上
返回值: 在(true),不在(false)

function Person(age){
    this.age = age;
}
var p = new Person(123);
console.log(Object.prototype.isPrototypeOf(p));//true
console.log(Person.prototype.isPrototypeOf(p));//true

4.propertyIsEnumerable()方法

作用:用來檢測屬性(必須爲實例屬性,原型屬性不行)是否可以在某個對象被for…in枚舉
返回值: 可枚舉(true),不可枚舉(false)

function Person(age){
    this.age = age;
}
Person.prototype.name = "ys";

var p1 = new Person('123');

console.log(p1.propertyIsEnumerable('age'));     //true
console.log(p1.propertyIsEnumerable('name'));    //false,在原型中   

for(var i in p1){
    console.log(i); //age,name
}

5.javascript中,有兩種屬性

  • 數據屬性:js對象屬性(平日我們用到的)
var a = {
    name: 'ys',
    age: 12
}

數據屬性4個特徵描述值

[[Configurable]]:該特性表示是否可以通過delete操作符來刪除屬性,默認值是true。
[[Enumerable]]:表示是否能夠通過for…in語句來枚舉出屬性,默認是true
[[Writable]]:表示屬性值是否可以修改,默認爲true
[[Value]]:表示屬性的值,默認爲undefined

defineProperty()方法修改特徵

var obj = {
    name: 'aa'
};
console.log(obj.name);  //aa
Object.defineProperty(obj, 'name', {
    value: 'ys',
    writable: false
});
obj.name = 'cc';
console.log(obj.name);  //ys
  • 訪問器屬性

    [[Configurable]]:該特性表示是否可以通過delete操作符來刪除屬性,默認值是true。
    [[Enumerable]]:表示是否能夠通過for…in語句來枚舉出屬性,默認是true
    [[Get]]:讀取屬性時調用的函數,默認是undefined
    [[Set]]:設置屬性時調用的函數,默認是undefined
    
var person = {
    name: 'ys',
    _age: 12
};

Object.defineProperty(person, 'age', {
    get: function(){
        return this._age;
    },
    //val 爲傳入的age值
    set: function(val){
        this._age = val;
        //通過name修改age值
        this.name = val > 20 ? 'abc' : 'ys';
    }
})

console.log(person.name);   //ys
person.age = 22;
console.log(person.name);   //abc

用到set,get函數時候,當對象不具有指定的屬性名稱時,發生此操作

發佈了57 篇原創文章 · 獲贊 84 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章