JavaScript 面向對象(隨筆)

構造函數建立對象

1構造函數是用new建立對象時調用的函數,與普通惟一的區別是構造函數名應該首字母大寫。函數

function Person() {
        this.age = 50;
    }

    let a = new Person();
    console.log(a.age); //50

2構造函數能夠接受參數this

function Person(age) {
        this.age = age;
    }

    let a = new Person(30);
    console.log(a.age); //30

若是沒有參數,能夠省略括號prototype

function Person(){
    this.age = 30;
}
//等價於var person1 = new Person()
var person1 = new Person;
console.log(person1.age);//30

若是忘記使用new操做符,則this將表明全局對象window。一般這種狀況下會容易發生不少錯誤。
必定要當心。code

function Person(){
    this.age = 30;
}
var person1 = Person();
//Uncaught TypeError: Cannot read property 'age' of undefined
console.log(person1.age);

instanceof(實例)

用來判斷對象的類型以及當前對象是不是經過指定構造函數構建而成對象

function Person() {
        //
    }
    let a = new Person();
    console.log(a instanceof Person); //true

constructor

每一個對象在建立時都自動擁有一個構造函數屬性constructor,其中包含了一個指向其構造函數的引用。而這個constructor屬性實際上繼承自原型對象,而constructor也是原型對象惟一的自有屬性繼承

function Person(){
    //
}
var person1 = new Person;
console.log(person1.constructor === Person);//true    
console.log(person1.__proto__.constructor === Person);//true

經過打印person1,你會發現,constructor 是一個繼承的屬性。原型

雖然對象實例及其構造函數之間存在這樣的關係,可是仍是建議使用instanceof來檢查對象類型。這是由於構造函數屬性能夠被覆蓋,並不必定徹底準確io

function Person(){
    //
}
var person1 = new Person;
Person.prototype.constructor = 123;
console.log(person1.constructor);//123
console.log(person1.__proto__.constructor);//123
相關文章
相關標籤/搜索