摘要:將這個(gè)空對(duì)象的原型,指向構(gòu)造函數(shù)的屬性。構(gòu)造函數(shù)內(nèi)部,指的是一個(gè)新生成的空對(duì)象,所有針對(duì)的操作,都會(huì)發(fā)生在這個(gè)空對(duì)象上。構(gòu)造函數(shù)之所以叫構(gòu)造函數(shù),就是說這個(gè)函數(shù)的目的,就是操作一個(gè)空對(duì)象即對(duì)象,將其構(gòu)造為需要的樣子。
toString() 的應(yīng)用:判斷數(shù)據(jù)類型
為了得到類型字符串,最好直接使用Object.prototype.toString方法。通過函數(shù)的call方法,可以在任意值上調(diào)用這個(gè)方法,幫助我們判斷這個(gè)值的類型。
**Object.prototype.toString.call(value)**
不同數(shù)據(jù)類型的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]。
可以寫出一個(gè)比typeof運(yùn)算符更準(zhǔn)確的類型判斷函數(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)鍵字。
開始執(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ù)”,就是說這個(gè)函數(shù)的目的,就是操作一個(gè)空對(duì)象(即this對(duì)象),將其“構(gòu)造”為需要的樣子。
如果構(gòu)造函數(shù)內(nèi)部有return語句,而且return后面跟著一個(gè)對(duì)象,new命令會(huì)返回return語句指定的對(duì)象;否則,就會(huì)不管return語句,返回this對(duì)象。
var Vehicle = function () { this.price = 1000; return 1000; }; (new Vehicle()) === 1000 // false
上面代碼中,構(gòu)造函數(shù)Vehicle的return語句返回一個(gè)數(shù)值。這時(shí),new命令就會(huì)忽略這個(gè)return語句,返回“構(gòu)造”后的this對(duì)象。
如果return語句返回的是一個(gè)跟this無關(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)部沒有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方法,用來滿足這種需求。該方法接受一個(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è)不繼承任何屬性(比如沒有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方法,用來判斷該對(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://systransis.cn/yun/94900.html
摘要:多一個(gè)技能多一條出路,祝你在自學(xué)道路上越走越好,掌握自己的核心技能,不只是優(yōu)秀,還要成為不可替代的人 NodeJs+Express+Mysql + Vuejs 項(xiàng)目實(shí)戰(zhàn) 最近準(zhǔn)備寫一系列文章,全面講述如何基于NodeJs + Express + Mysql + Vuejs 從零開發(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 小伙伴們,如果覺得本文還不錯(cuò),記得給個(gè) star , 小伙伴們的 star 是我持續(xù)更新的動(dòng)力!GitHub 地址 并不是只有特定的季節(jié)才能跑路,只因?yàn)槿伺艿枚嗔耍@條路就定下來了。 金三銀四跳槽季,jsliang 于 2019...
摘要:從到完美,用寫一個(gè)命令行工具中的字段現(xiàn)在,不管是前端項(xiàng)目還是項(xiàng)目,一般都會(huì)用做包管理工具,而是其相關(guān)的配置信息。又一個(gè)讓命令行與用戶進(jìn)行交互的工具與功能差不多。比較常用的命令行命令行相關(guān)的應(yīng)用就很多啦,比如等,但這些不僅僅是命令行工具。 從 1 到完美,用 node 寫一個(gè)命令行工具 1. package.json 中的 bin 字段 現(xiàn)在,不管是前端項(xiàng)目還是 node 項(xiàng)目,一般都會(huì)...
摘要:關(guān)于云服務(wù)器相關(guān)的文章優(yōu)惠碼優(yōu)惠碼整理專題每月更新最新優(yōu)惠活動(dòng)新用戶最高送美元韓國機(jī)房機(jī)房測(cè)評(píng)韓國首爾機(jī)房綜合速度和線路去程回程測(cè)試新人教程新人系列教程新注冊(cè)賬戶且用優(yōu)惠碼享受贈(zèng)送余額這篇文章中將會(huì)是Vultr十多個(gè)機(jī)房中的最后一個(gè)機(jī)房的測(cè)評(píng)。老蔣本來以為已經(jīng)全部測(cè)評(píng)完畢,但是數(shù)數(shù)看居然少了一個(gè),于是在這篇文章中補(bǔ)充下來自美國芝加哥機(jī)房的機(jī)房性能。實(shí)際上,我們通過前面的多篇文章測(cè)試的7個(gè)美國...
閱讀 2669·2023-04-26 00:42
閱讀 2815·2021-09-24 10:34
閱讀 3827·2021-09-24 09:48
閱讀 4163·2021-09-03 10:28
閱讀 2584·2019-08-30 15:56
閱讀 2781·2019-08-30 15:55
閱讀 3272·2019-08-29 12:46
閱讀 2251·2019-08-28 17:52