摘要:將這個(gè)空對(duì)象的原型,指向構(gòu)造函數(shù)的屬性。構(gòu)造函數(shù)內(nèi)部,指的是一個(gè)新生成的空對(duì)象,所有針對(duì)的操作,都會(huì)發(fā)生在這個(gè)空對(duì)象上。構(gòu)造函數(shù)之所以叫構(gòu)造函數(shù),就是說(shuō)這個(gè)函數(shù)的目的,就是操作一個(gè)空對(duì)象即對(duì)象,將其構(gòu)造為需要的樣子。
toString() 的應(yīng)用:判斷數(shù)據(jù)類(lèi)型
為了得到類(lèi)型字符串,最好直接使用Object.prototype.toString方法。通過(guò)函數(shù)的call方法,可以在任意值上調(diào)用這個(gè)方法,幫助我們判斷這個(gè)值的類(lèi)型。
**Object.prototype.toString.call(value)**
不同數(shù)據(jù)類(lèi)型的Object.prototype.toString方法返回值如下。
數(shù)值:返回[object Number]。
字符串:返回[object String]。
布爾值:返回[object Boolean]。
undefined:返回[object Undefined]。
null:返回[object Null]。
數(shù)組:返回[object Array]。
arguments 對(duì)象:返回[object Arguments]。
函數(shù):返回[object Function]。
Error 對(duì)象:返回[object Error]。
Date 對(duì)象:返回[object Date]。
RegExp 對(duì)象:返回[object RegExp]。
其他對(duì)象:返回[object Object]。
可以寫(xiě)出一個(gè)比typeof運(yùn)算符更準(zhǔn)確的類(lèi)型判斷函數(shù)。
var type = function (o){ var s = Object.prototype.toString.call(o); return s.match(/[object (.*?)]/)[1].toLowerCase(); }; type({}); // "object" type([]); // "array" type(5); // "number" type(null); // "null" type(); // "undefined" type(/abcd/); // "regex" type(new Date()); // "date"
new 命令的原理
使用new命令時(shí),它后面的函數(shù)依次執(zhí)行下面的步驟。
創(chuàng)建一個(gè)空對(duì)象,作為將要返回的對(duì)象實(shí)例。
將這個(gè)空對(duì)象的原型,指向構(gòu)造函數(shù)的prototype屬性。
將這個(gè)空對(duì)象賦值給函數(shù)內(nèi)部的this關(guān)鍵字。
開(kāi)始執(zhí)行構(gòu)造函數(shù)內(nèi)部的代碼。
構(gòu)造函數(shù)內(nèi)部,this指的是一個(gè)新生成的空對(duì)象,所有針對(duì)this的操作,都會(huì)發(fā)生在這個(gè)空對(duì)象上。構(gòu)造函數(shù)之所以叫“構(gòu)造函數(shù)”,就是說(shuō)這個(gè)函數(shù)的目的,就是操作一個(gè)空對(duì)象(即this對(duì)象),將其“構(gòu)造”為需要的樣子。
如果構(gòu)造函數(shù)內(nèi)部有return語(yǔ)句,而且return后面跟著一個(gè)對(duì)象,new命令會(huì)返回return語(yǔ)句指定的對(duì)象;否則,就會(huì)不管return語(yǔ)句,返回this對(duì)象。
var Vehicle = function () { this.price = 1000; return 1000; }; (new Vehicle()) === 1000 // false
上面代碼中,構(gòu)造函數(shù)Vehicle的return語(yǔ)句返回一個(gè)數(shù)值。這時(shí),new命令就會(huì)忽略這個(gè)return語(yǔ)句,返回“構(gòu)造”后的this對(duì)象。
如果return語(yǔ)句返回的是一個(gè)跟this無(wú)關(guān)的新對(duì)象,new命令會(huì)返回這個(gè)新對(duì)象,而不是this對(duì)象
var Vehicle = function (){ this.price = 1000; return { price: 2000 }; }; (new Vehicle()).price // 2000
如果對(duì)普通函數(shù)(內(nèi)部沒(méi)有this關(guān)鍵字的函數(shù))使用new命令,則會(huì)返回一個(gè)空對(duì)象。
function getMessage() { return "this is a message"; } var msg = new getMessage(); msg // {} typeof msg // "object"
函數(shù)內(nèi)部可以使用new.target屬性。如果當(dāng)前函數(shù)是new命令調(diào)用,new.target指向當(dāng)前函數(shù),否則為undefined。
function f() { console.log(new.target === f); } f() // false new f() // true
可以判斷函數(shù)調(diào)用的時(shí)候,是否使用new命令。
function f() { if (!new.target) { throw new Error("請(qǐng)使用 new 命令調(diào)用!"); } // ... } f() // Uncaught Error: 請(qǐng)使用 new 命令調(diào)用!Object.create() 創(chuàng)建實(shí)例對(duì)象
有時(shí)拿不到構(gòu)造函數(shù),只能拿到一個(gè)現(xiàn)有的對(duì)象。我們希望以這個(gè)現(xiàn)有的對(duì)象作為模板,生成新的實(shí)例對(duì)象
var person1 = { name: "張三", age: 38, greeting: function() { console.log("Hi! I"m " + this.name + "."); } }; var person2 = Object.create(person1); person2.name // 張三 person2.greeting() // Hi! I"m 張三.
Object.getPrototypeOf()
方法返回參數(shù)對(duì)象的原型。這是獲取原型對(duì)象的標(biāo)準(zhǔn)方法。
var F = function () {}; var f = new F(); Object.getPrototypeOf(f) === F.prototype // true // 空對(duì)象的原型是 Object.prototype Object.getPrototypeOf({}) === Object.prototype // true // Object.prototype 的原型是 null Object.getPrototypeOf(Object.prototype) === null // true // 函數(shù)的原型是 Function.prototype function f() {} Object.getPrototypeOf(f) === Function.prototype // true
object.create方法,用來(lái)滿足這種需求。該方法接受一個(gè)對(duì)象作為參數(shù),然后以它為原型,返回一個(gè)實(shí)例對(duì)象。該實(shí)例完全繼承原型對(duì)象的屬性。
// 原型對(duì)象 var A = { print: function () { console.log("hello"); } }; // 實(shí)例對(duì)象 var B = Object.create(A); Object.getPrototypeOf(B) === A // true B.print() // hello B.print === A.print // true //以A對(duì)象為原型,生成了B對(duì)象。B繼承了A的所有屬性和方法。
三種方式生成的新對(duì)象是等價(jià)的。
var obj1 = Object.create({}); var obj2 = Object.create(Object.prototype); var obj3 = new Object();
如果想要生成一個(gè)不繼承任何屬性(比如沒(méi)有toString和valueOf方法)的對(duì)象,可以將Object.create的參數(shù)設(shè)為null
對(duì)象obj的原型是null,它就不具備一些定義在Object.prototype對(duì)象上面的屬性,比如valueOf方法。
var obj = Object.create(null); obj.valueOf() // TypeError: Object [object Object] has no method "valueOf"
第二個(gè)參數(shù):是一個(gè)屬性描述對(duì)象,它所描述的對(duì)象屬性,會(huì)添加到實(shí)例對(duì)象,作為該對(duì)象自身的屬性。
實(shí)例對(duì)象的isPrototypeOf方法,用來(lái)判斷該對(duì)象是否為參數(shù)對(duì)象的原型。
Object.prototype.isPrototypeOf({}) // true Object.prototype.isPrototypeOf([]) // true Object.prototype.isPrototypeOf(/xyz/) // true Object.prototype.isPrototypeOf(Object.create(null)) // false
由于Object.prototype處于原型鏈的最頂端,所以對(duì)各種實(shí)例都返回true,只有直接繼承自null的對(duì)象除外。
對(duì)象實(shí)例的hasOwnProperty方法返回一個(gè)布爾值,用于判斷某個(gè)屬性定義在對(duì)象自身,還是定義在原型鏈上。
Date.hasOwnProperty("length") // true Date.hasOwnProperty("toString") // false對(duì)象的拷貝
確??截惡蟮膶?duì)象,與原對(duì)象具有同樣的原型。
確??截惡蟮膶?duì)象,與原對(duì)象具有同樣的實(shí)例屬性。
function copyObject(orig) { return Object.create( Object.getPrototypeOf(orig), Object.getOwnPropertyDescriptors(orig) ); } //利用 ES2017 才引入標(biāo)準(zhǔn)的Object.getOwnPropertyDescriptors方法
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/94900.html
摘要:多一個(gè)技能多一條出路,祝你在自學(xué)道路上越走越好,掌握自己的核心技能,不只是優(yōu)秀,還要成為不可替代的人 NodeJs+Express+Mysql + Vuejs 項(xiàng)目實(shí)戰(zhàn) 最近準(zhǔn)備寫(xiě)一系列文章,全面講述如何基于NodeJs + Express + Mysql + Vuejs 從零開(kāi)發(fā)前后端完全分離項(xiàng)目; 文筆及技術(shù)可能在某些方面欠佳,請(qǐng)您指正,共同學(xué)習(xí)進(jìn)步 前端:Vuejs全家桶 后端:...
Create by jsliang on 2019-2-11 15:30:34 Recently revised in 2019-3-17 21:30:36 Hello 小伙伴們,如果覺(jué)得本文還不錯(cuò),記得給個(gè) star , 小伙伴們的 star 是我持續(xù)更新的動(dòng)力!GitHub 地址 并不是只有特定的季節(jié)才能跑路,只因?yàn)槿伺艿枚嗔?,這條路就定下來(lái)了。 金三銀四跳槽季,jsliang 于 2019...
摘要:從到完美,用寫(xiě)一個(gè)命令行工具中的字段現(xiàn)在,不管是前端項(xiàng)目還是項(xiàng)目,一般都會(huì)用做包管理工具,而是其相關(guān)的配置信息。又一個(gè)讓命令行與用戶進(jìn)行交互的工具與功能差不多。比較常用的命令行命令行相關(guān)的應(yīng)用就很多啦,比如等,但這些不僅僅是命令行工具。 從 1 到完美,用 node 寫(xiě)一個(gè)命令行工具 1. package.json 中的 bin 字段 現(xiàn)在,不管是前端項(xiàng)目還是 node 項(xiàng)目,一般都會(huì)...
摘要:關(guān)于云服務(wù)器相關(guān)的文章優(yōu)惠碼優(yōu)惠碼整理專(zhuān)題每月更新最新優(yōu)惠活動(dòng)新用戶最高送美元韓國(guó)機(jī)房機(jī)房測(cè)評(píng)韓國(guó)首爾機(jī)房綜合速度和線路去程回程測(cè)試新人教程新人系列教程新注冊(cè)賬戶且用優(yōu)惠碼享受贈(zèng)送余額這篇文章中將會(huì)是Vultr十多個(gè)機(jī)房中的最后一個(gè)機(jī)房的測(cè)評(píng)。老蔣本來(lái)以為已經(jīng)全部測(cè)評(píng)完畢,但是數(shù)數(shù)看居然少了一個(gè),于是在這篇文章中補(bǔ)充下來(lái)自美國(guó)芝加哥機(jī)房的機(jī)房性能。實(shí)際上,我們通過(guò)前面的多篇文章測(cè)試的7個(gè)美國(guó)...
閱讀 2769·2023-04-26 00:42
閱讀 2901·2021-09-24 10:34
閱讀 3929·2021-09-24 09:48
閱讀 4262·2021-09-03 10:28
閱讀 2669·2019-08-30 15:56
閱讀 2849·2019-08-30 15:55
閱讀 3341·2019-08-29 12:46
閱讀 2316·2019-08-28 17:52