亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JavaScript面向?qū)ο缶?二)

wayneli / 1658人閱讀

摘要:使用時(shí),會(huì)自動(dòng)創(chuàng)建對(duì)象,其類型為構(gòu)造函數(shù)類型,指向?qū)ο髮?shí)例缺少關(guān)鍵字,指向全局對(duì)象。構(gòu)造函數(shù)本身也具有屬性指向原型對(duì)象。

在JavaScript面向?qū)ο缶?一)中講解了一些與面向?qū)ο笙嚓P(guān)的概念和方法,這篇講講原型和繼承。

構(gòu)造函數(shù)和原型對(duì)象

構(gòu)造函數(shù)也是函數(shù),用new創(chuàng)建對(duì)象時(shí)調(diào)用的函數(shù),與普通函數(shù)的一個(gè)區(qū)別是,其首字母應(yīng)該大寫。但如果將構(gòu)造函數(shù)當(dāng)作普通函數(shù)調(diào)用(缺少new關(guān)鍵字),則應(yīng)該注意this指向的問(wèn)題。

var name = "Pomy";
function Per(){
    console.log("Hello "+this.name);
}
var per1 = new Per();  //"Hello undefined"
var per2 = Per();   //"Hello Pomy"

使用new時(shí),會(huì)自動(dòng)創(chuàng)建this對(duì)象,其類型為構(gòu)造函數(shù)類型,指向?qū)ο髮?shí)例;缺少new關(guān)鍵字,this指向全局對(duì)象。
可以用instanceof來(lái)檢測(cè)對(duì)象類型,同時(shí)每個(gè)對(duì)象在創(chuàng)建時(shí)都自動(dòng)擁有一個(gè)constructor屬性,指向其構(gòu)造函數(shù)(字面量形式或Object構(gòu)造函數(shù)創(chuàng)建的對(duì)象,指向Object,自定義構(gòu)造函數(shù)創(chuàng)建的對(duì)象則指向它的構(gòu)造函數(shù))。

console.log(per1 instanceof Per);  //true
console.log(per1.constructor === Per); //true

每個(gè)對(duì)象實(shí)例都有一個(gè)內(nèi)部屬性:[[Prototype]],其指向該對(duì)象的原型對(duì)象。構(gòu)造函數(shù)本身也具有prototype屬性指向原型對(duì)象。所有創(chuàng)建的對(duì)象都共享該原型對(duì)象的屬性和方法。

function Person(){}
Person.prototype.name="dwqs";
Person.prototype.age=20;
Person.prototype.sayName=function()
{
    alert(this.name);
};
var per1 = new Person();
per1.sayName();  //dwqs
var per2 = new Person();
per2.sayName();  //dwqs
alert(per1.sayName == per2.sayName);  //true


所以,實(shí)例中的指針僅指向原型,而不指向構(gòu)造函數(shù)。ES5提供了hasOwnProperty()isPropertyOf()方法來(lái)反應(yīng)原型對(duì)象和實(shí)例之間的關(guān)系

alert(Person.prototype.isPrototypeOf(per2));  //true
per1.blog = "www.ido321.com";
alert(per1.hasOwnProperty("blog"));  //true
alert(Person.prototype.hasOwnProperty("blog"));  //false
alert(per1.hasOwnProperty("name"));  //false
alert(Person.prototype.hasOwnProperty("name"));  //true

因?yàn)樵蛯?duì)象的constructor屬性是指向構(gòu)造函數(shù)本身,所以在重寫原型時(shí),需要注意constructor屬性的指向問(wèn)題。

function Hello(name){
    this.name = name;
}
//重寫原型
Hello.prototype = {
    sayHi:function(){
        console.log(this.name);
    }
};
var hi = new Hello("Pomy");
console.log(hi instanceof Hello);  //true
console.log(hi.constructor === Hello); //false
console.log(hi.constructor === Object); //true

使用對(duì)象字面量形式改寫原型對(duì)象改變了構(gòu)造函數(shù)的屬性,因此constructor指向Object,而不是Hello。如果constructor指向很重要,則需要在改寫原型對(duì)象時(shí)手動(dòng)重置其constructor屬性

Hello.prototype = {
    constructor:Hello,
    sayHi:function(){
        console.log(this.name);
    }
};
console.log(hi.constructor === Hello); //true
console.log(hi.constructor === Object); //false

利用原型對(duì)象的特性,我們可以很方便的在JavaScript的內(nèi)建原型對(duì)象上添加自定義方法:

Array.prototype.sum=function(){
    return this.reduce(function(prev,cur){
        return prev+cur;
    });
};
var num = [1,2,3,4,5,6];
var res = num.sum();
console.log(res);  //21

String.prototype.capit = function(){
    return this.charAt(0).toUpperCase()+this.substring(1);
};
var msg = "hello world";
console.log(msg.capit()); //"Hello World"
繼承

利用[[Prototype]]特性,可以實(shí)現(xiàn)原型繼承;對(duì)于字面量形式的對(duì)象,會(huì)隱式指定Object.prototype為其[[Prototype]],也可以通過(guò)Object.create()顯示指定,其接受兩個(gè)參數(shù):第一個(gè)是[[Prototype]]指向的對(duì)象(原型對(duì)象),第二個(gè)是可選的屬性描述符對(duì)象。

var book = {
    title:"這是書名";
};
//和下面的方式一樣
var book = Object.create(Object.prototype,{
    title:{
        configurable:true,
        enumerable:true,
        value:"這是書名",
        wratable:true
    }
});

字面量對(duì)象會(huì)默認(rèn)繼承自Object,更有趣的用法是,在自定義對(duì)象之間實(shí)現(xiàn)繼承。

var book1 = {
    title:"JS高級(jí)程序設(shè)計(jì)",
    getTitle:function(){
        console.log(this.title);
    }
};
var book2 = Object.create(book1,{
    title:{
        configurable:true,
        enumerable:true,
        value:"JS權(quán)威指南",
        wratable:true
    }
});
book1.getTitle();  //"JS高級(jí)程序設(shè)計(jì)"
book2.getTitle();  //"JS權(quán)威指南"

console.log(book1.hasOwnProperty("getTitle"));  //true
console.log(book1.isPrototypeOf("book2"));  //false
console.log(book2.hasOwnProperty("getTitle"));  //false

當(dāng)訪問(wèn)book2getTitle屬性時(shí),JavaScript引擎會(huì)執(zhí)行一個(gè)搜索過(guò)程:現(xiàn)在book2的自有屬性中尋找,找到則使用,若沒有找到,則搜索[[Prototype]],若沒有找到,則繼續(xù)搜索原型對(duì)象的[[Prototype]],直到繼承鏈末端。末端通常是Object.prototype,其[[Prototype]]被設(shè)置為null。

實(shí)現(xiàn)繼承的另外一種方式是利用構(gòu)造函數(shù)。每個(gè)函數(shù)都具有可寫的prototype屬性,默認(rèn)被自懂設(shè)置為繼承自Object.prototype,可以通過(guò)改寫它來(lái)改變?cè)玩湣?/p>

function Rect(length,width){
    this.length = length;
    this.width = width;
}
Rect.prototype.getArea = function(){
    return this.width * this.length;
};
Rect.prototype.toString = function(){
    return "[Rect"+this.length+"*"+this.width+"]";
};

function Square(size){
    this.length = size;
    this.width = size;
}
//修改prototype屬性
Square.prototype = new Rect();
Square.prototype.constructor = Square;
Square.prototype.toString = function(){
    return "[Square"+this.length+"*"+this.width+"]";
};

var rect = new Rect(5,10);
var square = new Square(6);

console.log(rect.getArea());  //50
console.log(square.getArea());  //36

如果要訪問(wèn)父類的toString(),可以這樣做:

Square.prototype.toString = function(){
    var text = Rect.prototype.toString.call(this);
    return text.replace("Rect","Square");
}
原文:http://www.ido321.com/1586.html

相關(guān)文章:
DOM筆記(十二):又談原型對(duì)象
DOM筆記(十三):JavaScript的繼承方式

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/85727.html

相關(guān)文章

  • Javascript面向對(duì)象精要讀書筆記

    摘要:面向?qū)ο缶x書筆記下面代碼的實(shí)際執(zhí)行過(guò)程是什么使用原始值和原始封裝類型是有區(qū)別的因?yàn)槭潜唤馕龀梢粋€(gè)對(duì)象的,所以肯定是真的函數(shù)是對(duì)象,函數(shù)有兩種字面形式,第一種是函數(shù)聲明,以關(guān)鍵字開頭后面跟函數(shù)名字。 Javascript面向?qū)ο缶x書筆記 1、下面代碼的實(shí)際執(zhí)行過(guò)程是什么? var name = fan var str = name.charAt(0) console.l...

    roadtogeek 評(píng)論0 收藏0
  • JavaScript面向對(duì)象精要(一)

    摘要:使函數(shù)不同于其他對(duì)象的決定性特性是函數(shù)存在一個(gè)被稱為的內(nèi)部屬性。其中,是一個(gè)布爾值,指明改對(duì)象本身是否可以被修改值為。注意凍結(jié)對(duì)象和封印對(duì)象均要在嚴(yán)格模式下使用。 數(shù)據(jù)類型 在JavaScript中,數(shù)據(jù)類型分為兩類: 原始類型:保存一些簡(jiǎn)單數(shù)據(jù),如true,5等。JavaScript共有5中原始類型: boolean:布爾,值為true或false number:數(shù)字,值...

    hiYoHoo 評(píng)論0 收藏0
  • JavaScript面向對(duì)象精要》讀書筆記

    摘要:解除引用的最佳手段是將對(duì)象變量設(shè)置為。字面形式允許你在不需要使用操作符和構(gòu)造函數(shù)顯示創(chuàng)建對(duì)象的情況下生成引用值。函數(shù)就是值可以像使用對(duì)象一樣使用函數(shù)因?yàn)楹瘮?shù)本來(lái)就是對(duì)象,構(gòu)造函數(shù)更加容易說(shuō)明。 JavaScript(ES5)的面向?qū)ο缶?標(biāo)簽: JavaScript 面向?qū)ο?讀書筆記 2016年1月16日-17日兩天看完了《JavaScript面向?qū)ο缶罚▍⒓赢惒缴鐓^(qū)的活動(dòng)送...

    GitCafe 評(píng)論0 收藏0
  • BREW精要之COM 模型

    摘要:與使用作為接口的唯一標(biāo)識(shí)類似,使用稱之為的一個(gè)字節(jié)無(wú)符號(hào)整數(shù)作為唯一標(biāo)識(shí)。接口是客戶程序和組件程序之間的橋梁,接口應(yīng)該具有不變性,并且一個(gè)對(duì)象也應(yīng)該支持多個(gè)接口。 COM是Component Object Model (組件對(duì)象模型)的縮寫。BREW基本上遵從COM這一組件構(gòu)架的。組...

    lily_wang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<