最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript面向?qū)ο缶?下部)

 更新時(shí)間:2017年09月12日 17:35:58   投稿:mdxy-dxy  
這篇文章主要介紹了JavaScript面向?qū)ο缶?下部),需要的朋友可以參考下

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

構(gòu)造函數(shù)也是函數(shù),用new創(chuàng)建對(duì)象時(shí)調(diào)用的函數(shù),與普通函數(shù)的一個(gè)區(qū)別是,其首字母應(yīng)該大寫(xiě)。但如果將構(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ù)本身,所以在重寫(xiě)原型時(shí),需要注意constructor屬性的指向問(wèn)題。

function Hello(name){
  this.name = name;
}
//重寫(xiě)原型
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ì)象字面量形式改寫(xiě)原型對(duì)象改變了構(gòu)造函數(shù)的屬性,因此constructor指向Object,而不是Hello。如果constructor指向很重要,則需要在改寫(xiě)原型對(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:"這是書(shū)名";
};
//和下面的方式一樣
var book = Object.create(Object.prototype,{
  title:{
    configurable:true,
    enumerable:true,
    value:"這是書(shū)名",
    wratable:true
  }
});

字面量對(duì)象會(huì)默認(rèn)繼承自O(shè)bject,更有趣的用法是,在自定義對(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)book2的getTitle屬性時(shí),JavaScript引擎會(huì)執(zhí)行一個(gè)搜索過(guò)程:現(xiàn)在book2的自有屬性中尋找,找到則使用,若沒(méi)有找到,則搜索[[Prototype]],若沒(méi)有找到,則繼續(xù)搜索原型對(duì)象的[[Prototype]],直到繼承鏈末端。末端通常是Object.prototype,其[[Prototype]]被設(shè)置為null。

實(shí)現(xiàn)繼承的另外一種方式是利用構(gòu)造函數(shù)。每個(gè)函數(shù)都具有可寫(xiě)的prototype屬性,默認(rèn)被自懂設(shè)置為繼承自O(shè)bject.prototype,可以通過(guò)改寫(xiě)它來(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");
}

您可能感興趣的文章:

相關(guān)文章

  • 干貨分享:讓你分分鐘學(xué)會(huì)javascript閉包

    干貨分享:讓你分分鐘學(xué)會(huì)javascript閉包

    干貨分享:讓你分分鐘學(xué)會(huì)javascript閉包,如何才能快速學(xué)會(huì)javascript閉包,本文為大家揭曉
    2015-12-12
  • 前端精度丟失問(wèn)題解決之后端Long類型到前端的處理策略

    前端精度丟失問(wèn)題解決之后端Long類型到前端的處理策略

    這篇文章主要介紹了前端精度丟失問(wèn)題解決之后端Long類型到前端的處理策略,在Web開(kāi)發(fā)中前后端數(shù)據(jù)類型不匹配尤其是Long類型數(shù)據(jù)到前端可能導(dǎo)致精度丟失,文章探討了此問(wèn)題并提供三種解決方法,需要的朋友可以參考下
    2024-09-09
  • JavaScript中Map與reduce的應(yīng)用小結(jié)

    JavaScript中Map與reduce的應(yīng)用小結(jié)

    Map構(gòu)造函數(shù)創(chuàng)建一個(gè)新Map對(duì)象,它允許以鍵值對(duì)的形式存儲(chǔ)數(shù)據(jù),提供了一種更加靈活的數(shù)據(jù)結(jié)構(gòu),本文給大家介紹JavaScript中Map與reduce的應(yīng)用小結(jié),感興趣的朋友一起看看吧
    2024-06-06
  • Canvas實(shí)現(xiàn)微信紅包照片效果

    Canvas實(shí)現(xiàn)微信紅包照片效果

    這篇文章主要為大家詳細(xì)介紹了Canvas實(shí)現(xiàn)微信紅包照片效果,用canvas及css3結(jié)合,實(shí)現(xiàn)紅包照片的效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 微信小程序自定義toast實(shí)現(xiàn)方法詳解【附demo源碼下載】

    微信小程序自定義toast實(shí)現(xiàn)方法詳解【附demo源碼下載】

    這篇文章主要介紹了微信小程序自定義toast實(shí)現(xiàn)方法,簡(jiǎn)單描述了微信小程序自帶toast使用方法,并結(jié)合實(shí)例形式分析了自定義toast的定義與使用方法,需要的朋友可以參考下
    2017-11-11
  • 如何基于JS實(shí)現(xiàn)Ajax并發(fā)請(qǐng)求的控制詳解

    如何基于JS實(shí)現(xiàn)Ajax并發(fā)請(qǐng)求的控制詳解

    通常為了減少頁(yè)面加載時(shí)間,先把核心內(nèi)容顯示處理,頁(yè)面加載完成后再發(fā)送ajax請(qǐng)求獲取其他數(shù)據(jù),這時(shí)就可能產(chǎn)生多個(gè)ajax請(qǐng)求,為了用戶體驗(yàn),最好是發(fā)送并行請(qǐng)求,這篇文章主要給大家介紹了關(guān)于如何基于JS實(shí)現(xiàn)Ajax并發(fā)請(qǐng)求控制的相關(guān)文章,需要的朋友可以參考下
    2021-08-08
  • ECMAScript5中的對(duì)象存取器屬性:getter和setter介紹

    ECMAScript5中的對(duì)象存取器屬性:getter和setter介紹

    這篇文章主要介紹了ECMAScript5中的對(duì)象屬性存取器:getter和setter介紹,事實(shí)上在除ie外最新主流瀏覽器的實(shí)現(xiàn)中,任何一個(gè)對(duì)象的鍵值都可以被getter和setter方法所取代,這被稱之為“存取器屬性”,需要的朋友可以參考下
    2014-12-12
  • 原生js實(shí)現(xiàn)jquery函數(shù)animate()動(dòng)畫(huà)效果的簡(jiǎn)單實(shí)例

    原生js實(shí)現(xiàn)jquery函數(shù)animate()動(dòng)畫(huà)效果的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇原生js實(shí)現(xiàn)jquery函數(shù)animate()動(dòng)畫(huà)效果的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • JavaScript獲取URL參數(shù)的四種方法總結(jié)

    JavaScript獲取URL參數(shù)的四種方法總結(jié)

    在前端開(kāi)發(fā)過(guò)程中難免會(huì)遇到處理url參數(shù)的問(wèn)題,這篇文章主要給大家總結(jié)介紹了關(guān)于JavaScript獲取URL參數(shù)的四種方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 如何解決ligerUI布局時(shí)Center中的Tab高度大小

    如何解決ligerUI布局時(shí)Center中的Tab高度大小

    這篇文章主要介紹了如何解決ligerUI布局時(shí)Center中的Tab高度大小的相關(guān)資料,需要的朋友可以參考下
    2015-11-11

最新評(píng)論

海阳市| 石泉县| 阿克陶县| 广水市| 红原县| 正宁县| 密山市| 金寨县| 冷水江市| 子洲县| 龙山县| 东山县| 临颍县| 连江县| 安庆市| 出国| 陈巴尔虎旗| 运城市| 武乡县| 巩留县| 灵璧县| 贵阳市| 安溪县| 阿图什市| 延安市| 乌鲁木齐县| 蓝田县| 恩施市| 泽普县| 张家界市| 石阡县| 法库县| 肥东县| 冷水江市| 九龙县| 吴堡县| 云龙县| 游戏| 西盟| 新蔡县| 永兴县|