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