欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

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

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

成都網(wǎng)絡(luò)公司-成都網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)十年經(jīng)驗成就非凡,專業(yè)從事成都網(wǎng)站制作、做網(wǎng)站,成都網(wǎng)頁設(shè)計,成都網(wǎng)頁制作,軟文營銷,廣告投放等。十年來已成功提供全面的成都網(wǎng)站建設(shè)方案,打造行業(yè)特色的成都網(wǎng)站建設(shè)案例,建站熱線:028-86922220,我們期待您的來電!

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

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

使用new時,會自動創(chuàng)建this對象,其類型為構(gòu)造函數(shù)類型,指向?qū)ο髮嵗?;缺少new關(guān)鍵字,this指向全局對象。

可以用instanceof來檢測對象類型,同時每個對象在創(chuàng)建時都自動擁有一個constructor屬性,指向其構(gòu)造函數(shù)(字面量形式或Object構(gòu)造函數(shù)創(chuàng)建的對象,指向Object,自定義構(gòu)造函數(shù)創(chuàng)建的對象則指向它的構(gòu)造函數(shù))。

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

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

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

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

所以,實例中的指針僅指向原型,而不指向構(gòu)造函數(shù)。 ES5提供了hasOwnProperty()和isPropertyOf()方法來反應(yīng)原型對象和實例之間的關(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

因為原型對象的constructor屬性是指向構(gòu)造函數(shù)本身,所以在重寫原型時,需要注意constructor屬性的指向問題。

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

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

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

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

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]]特性,可以實現(xiàn)原型繼承;對于字面量形式的對象,會隱式指定Object.prototype為其[[Prototype]],也可以通過Object.create()顯示指定,其接受兩個參數(shù):第一個是[[Prototype]]指向的對象(原型對象),第二個是可選的屬性描述符對象。

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

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

var book1 = {
  title:"JS高級程序設(shè)計",
  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高級程序設(shè)計"
book2.getTitle(); //"JS權(quán)威指南"
console.log(book1.hasOwnProperty("getTitle")); //true
console.log(book1.isPrototypeOf("book2")); //false
console.log(book2.hasOwnProperty("getTitle")); //false

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

實現(xiàn)繼承的另外一種方式是利用構(gòu)造函數(shù)。每個函數(shù)都具有可寫的prototype屬性,默認被自懂設(shè)置為繼承自O(shè)bject.prototype,可以通過改寫它來改變原型鏈。

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

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

Square.prototype.toString = function(){
  var text = Rect.prototype.toString.call(this);
  return text.replace("Rect","Square");
}

網(wǎng)站題目:JavaScript面向?qū)ο缶?下部)
鏈接分享:http://aaarwkj.com/article14/jjhhde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、靜態(tài)網(wǎng)站、ChatGPT、移動網(wǎng)站建設(shè)營銷型網(wǎng)站建設(shè)、虛擬主機

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
亚洲成人久久久久久久| 亚洲中文有码一区二区| 国产三级全黄在线播放| 青青草原影院在线观看| 精品黄色大片不卡国产| 久久东京热日韩精品一区| 亚洲黄色一区大陆av剧情| 刘亦菲毛片一区二区三区| 精品黄色大片不卡国产| 精品国产av一区二区三广区| 日韩激情中文字幕一区二区三区| 日韩 高清 一区二区| 欧美性极品少妇精品网站| 日韩有码大片最新自拍| 侵犯人妻中文字幕一区二区| 很黄无遮挡在线免费网站| 高清区一区二区在线播放| 亚洲欧洲日本一区精品| 欧美日韩亚洲国产三级| 天天操天天干夜夜射| 丝袜美腿精尽福利视频网址大全 | 国产丝袜美腿在线观看| 久久女同互慰一区二区三区| 国产精品中文字幕欧美日韩| 国产午夜视频成人无遮挡| 国产午夜福利片新视觉| av影片免费网址大全| 欧美激情一区二区亚洲专区| 亚洲熟女午夜毛片av毛片| 91亚洲精品久久久蜜桃网站| 欧美午夜福利视频电影| 国产丝袜美腿视频亚洲综合| 热久久青草精品欧美一区| 国产精品一区二区av麻豆| 欧美日韩在线视频一区| 持续侵犯人妻中文字幕| 麻豆视传媒短视频网站| 成人大片在线免费观看视频| 亚洲成人影院中文字幕| 欧美一区二区专区在线| 色在色在线播放亚洲中文|