1. 程式人生 > >js13--對象、原型

js13--對象、原型

ray 指向 判斷 概念 工廠 根據 另一個 object.h ack

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Untitled Document</title>
        <script type=text/javascript charset=utf-8
> var obj = new Object(); // 一樣的var obj = {}; var a = new F(); obj.name = z3; obj.sex = ; obj.sayName = function(){alert(我是張三!)}; // 類的概念 // 第一種形式 工廠模型 function createPerson(name , sex , age){ var obj = new Object(); obj.name
= name ; obj.sex = sex ; obj.age = age ; obj.sayName = function(){ alert(this.name); } return obj; } var p1 = createPerson(z3 , , 20); var p2 = createPerson(z4 , , 25); alert(p1.sex); p1.sayName();
// 第二中形式 構造函數式 new Array new Date // 函數的第一個字母大寫 (類的模版) function Person(name , age , sex){ this.name = name ; this.age = age ; this.sex = sex ; this.sayName = function(){ alert(this.name); } } //構造一個對象 new關鍵字 傳遞參數 執行模版代碼 返回對象 var p1 = new Person(小1 , 20 , ); var p2 = new Person(小2 , 21 , ); alert(p1.name); p1.sayName(); alert(p1 == p2); //false, alert(p1.constructor == Person); alert(p2.constructor == Person); alert(p1 instanceof Person); //true alert(p1 instanceof Object); //true //創建對象的方式: // 1當作構造函數去使用 : var p1 = new Person(小1 , 20 , ); // 2作為普通的函數去調用 Person(小2 , 25 , );//在全局環境裏定義屬性並復制 直接定義在window上,this是window, alert(name); // 3在另一個對象的作用域中調用 var o = new Object(); // call applly Person.call(o,小4 , 12 , ); //o動態加一個方法,一次性的,復制方法的屬性 alert(o.name); </script> </head> <body> </body> </html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Untitled Document</title>
        <script type=text/javascript charset=utf-8>
        //同級函數可以互相訪問
        function Person(name , age){
            this.name = 1 ; 
            sayName() ; //同級函數可以互相訪問
            alert(333);
        }

        function sayName(){
            alert(222);
            Person();//同級函數可以互相訪問
        }
        
        // 原型 prototype
        function Person(name , age){
            this.name = name ; 
            this.age  = age ; 
            this.sayName = function(){alert(我是姓名!)};//後面的函數看成匿名對象,每次不一樣。函數可以公用,放在原型裏面。
            this.sayName = sayName1 ; //右邊的函數是外部的函數
        }
        // 定義了一次函數
        function sayName1(){
            alert(this.name);
        }
        var p1 = new Person(z3,20);
        var p2 = new Person(z4,21);
        p1.sayName();
        p2.sayName();
        alert(p1.sayName == p2.sayName);     // false 
        alert(p1.name == p2.name);         // false 
        
        
        // prototype 創建每一個函數都有一個prototype屬性,這個屬性其實是一個指針,而這個指針總指向一個對象
        // 這個對象的用途就是將特定的屬性和方法包含在內,起到一個所有實例所共享的作用
        //閉包實現了函數層面多個子函數共享父類函數的屬性、方法。類層面上原型實現了多個子類對象共享父類對象的屬性、方法。
        function Person(){}
        var obj = Person.prototype;//原型的構造器是函數本身
        alert(typeof obj);//object
        obj.name = z3;
        obj.age  = 20 ; 
        obj.sayName = function(){alert(this.name);};//原型對象裏面的this是對象自己
        var p1 = new Person();
        var p2 = new Person();
        alert(p1.age);
        alert(p2.age);
        p1.sayName();
        p2.sayName();
        alert(p1.sayName == p2.sayName)//true,同一個地址
        
        //函數.prototype =  原型對象,原型對象.constructor = 函數
        alert(obj.constructor);//Person
        //實例對象.prototype = 原型對象
        alert(p1.prototype);
        alert(obj.isPrototypeOf(p1));//是不是這個對象的原型
        //Object.getPrototypeOf():根據實例對象獲得原型對象
        //object.hasOwnProperty(attribute) 判斷屬性是否屬於對象本身
//in 操作符 判斷對象中是否存在該屬性(無論是實例對象還是原型對象)
//Object.keys();拿到當前對象裏的所有keys 返回一個數組
//getOwnPropertyNames 枚舉對象所有的屬性 :不管該內部屬性能否被枚舉

        </script>
    </head>
    <body>
    </body>
</html>

js13--對象、原型