1. 程式人生 > >原型,原型對象,原型鏈,構造函數,繼承(二)

原型,原型對象,原型鏈,構造函數,繼承(二)

自己 func 所在 __proto__ == false reat this指向 copy

1.prototype(原型對象)有一個屬性叫做constructor,constructor默認指向prototype(原型對象)所在的構造函數

2.constructor屬性是定義在prototype上的,那就意味著可以被實例對象所繼承

3.可以使用hasOwnProperty 方法來驗證一個屬性是自己的還是繼承過來的

4.constructor的作用:
  作用一:分辨原型對象到底屬於哪個構造函數 instanceof()
  作用二:可以從一個實例對象創建另一個實例對象

     var Fun = function(){
            console.log(‘hello‘);
            console.log(
‘world!‘); } var fun = new Fun(); console.log(Fun.prototype.constructor === Fun); //true console.log(fun.constructor === Fun); //true console.log(Fun.prototype.hasOwnProperty("constructor")); // true console.log(fun.hasOwnProperty("constructor")); //false console.log(fun
instanceof Fun);//true var fun1 = new fun.constructor(); console.log(fun1 instanceof Fun); //true
     Fun.prototype.createCopy = function(){
            console.log(this);
            console.log(this.constructor);
            return new this.constructor();
        }
        // this.constructor指向Fun , this指向調用者本身
var fun2 = new Fun(); console.log(fun2.constructor === Fun.prototype.constructor);//true console.log(fun2.constructor === Fun);//true console.log(fun2.createCopy().__proto__ === Fun.prototype);//true

繼承:

     function Father(){
            this.sex = ‘男‘;
        }
        function Son(){
            this.age = 24;
            Son.superclass.constructor.call(this);
        }
        Son.superclass = new Father();
        var son = new Son();
        console.log(son.age);
        console.log(son.sex);
        console.log(Son.superclass); //Father

註意: 由於constructor屬性是一種原型對象與構造函數的關聯關系,所以我們修改原型對象的時候務必要小心

     function A(){

        }
        function B(){

        }
        var a = new A();
        A.prototype = B.prototype;
        console.log(a.constructor);
        console.log(a.constructor === A);//true
        console.log(a.constructor === B);//false

        console.log(a instanceof A);//false
        console.log(a instanceof B);//false

原型,原型對象,原型鏈,構造函數,繼承(二)