摘要:這種方法也存在這樣的問題如果修改了構造函數的原型對象,之前創建的對象無法通過這種方式來確定類型修改構造函數的原型對象會導致之前創建的對象無法通過這種方式判斷類型判斷對象繼承自哪些父類型使用使用
判斷對象類型的方法 使用原型對象上的constructor屬性來判斷
注意:對象沒有constructor屬性(除非自己添加),constructor屬性是放在原型對象上的(通過原型鏈訪問到)
function Person(){ } var person = new Person(); person.constructor === Person // true person.constructor === Object // false var object = {a:1,b:2} object.constructor === Object // true
如果重寫了函數的原型對象,則有可能無法使用這個方法
function Person(){ } Person.prototype = { } var p1 = new Person() p1.constructor === Person //false
如果希望可以使用這種方法,則可以給新的原型對象設置constructor屬性
function Person(){ } Person.prototype = { constructor: Person } var p1 = new Person() p1.constructor === Person // true
使用constructor屬性來判斷對象類型(結合上面最后的方法)的優點是:無論如何修改構造函數的原型對象,之前創建的對象的constructor屬性一定指向構造函數,因此一定可以判斷出他們的類型
使用instanceof 運算符instanceof運算符用來測試一個對象在其原型鏈中是否存在一個構造函數的原型對象(通俗的講就是判斷一個對象的原型鏈上是否存在一個構造函數的原型對象)
function Person(){ } var person = new Person(); person instanceof Person // true person instanceof Object // true var object = {a:1,b:2} object instanceof Object // true
注意:如果重寫了構造函數的原型對象,則會出現無法判斷(之前創建的)對象是否屬于該類型: 因為重寫了構造函數的原型對象,而(之前創建的)對象的原型鏈中仍然是之前構造函數的原型對象
function Person(){ } var p1 = new Person() p1 instanceof Person // true Person.prototype = { name: "aaa", age: "20" } // p1是修改構造函數原型對象之前創建的對象 // p1的__proto__仍然指向原來的原型對象 p1 instanceof Person // false // p2是修改構造函數原型對象之后創建的對象 var p2 = new Person() p2 instanceof Person // true使用Object.getPrototypeOf()方法
Object.getPrototypeof()可以獲取對象的原型。這種方法也存在這樣的問題:如果修改了構造函數的原型對象,之前創建的對象無法通過這種方式來確定類型
function Person(){ } var p1 = new Person() Object.getPrototypeOf(p1) === Person.prototype // true Object.getPrototypeOf(p1) === Object.prototype // false Person.prototype = { name: "aaa", age: "20" } // p1是修改構造函數原型對象之前創建的對象 // p1的__proto__仍然指向原來的原型對象 Object.getPrototypeOf(p1) === Person.prototype // false // p2是修改構造函數原型對象之后創建的對象 var p2 = new Person() Object.getPrototypeOf(p2) === Person.prototype // true使用isPrototypeOf()方法
isPrototypeOf()方法可以判斷一個對象是否存在于另一個對象的原型鏈上。這種方法也存在這樣的問題:如果修改了構造函數的原型對象,之前創建的對象無法通過這種方式來確定類型
function Person(){ } var p1 = new Person() Person.prototype.isPrototypeOf(p1) // true Object.prototype.isPrototypeOf(p1) //true Person.prototype = { } Person.prototype.isPrototypeOf(p1) // false Object.prototype.isPrototypeOf(p1) //true var p2 = new Person() Person.prototype.isPrototypeOf(p2) // true Object.prototype.isPrototypeOf(p2) //true
修改構造函數的原型對象會導致之前創建的對象無法通過這種方式判斷類型
判斷對象繼承自哪些父類型 使用instanceofinstance instanceof Object //true instance instanceof SuperType // true instance instanceof SubType //true使用isPrototypeOf
Object.prototype.isPrototypeOf(instance) // true SuperType.prototype.isPrototypeOf(instance) // true SubType.prototype.isPrototypeOf(instance) // true
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83388.html
摘要:繼承原型鏈原型鏈是實現繼承的主要方法。臨時的構造函數將傳入的對象作為這個構造函數的原型返回新實例以為原型創建一個新實例不僅屬于所有,而且也會被共享。上訴例子只調用了一次構造函數,因此避免了在上面創建不必要的多余的屬性。 繼承 1 原型鏈 原型鏈是實現繼承的主要方法。其基本思想是利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。 構造函數、原型和實例的關系 每個構造函數都有一個原型對...
摘要:原型對象的問題省略了為構造函數傳遞參數,導致了所有實例在默認情況下都取得相同的屬性值。即使有其他代碼會給這個對象添加方法或數據成員,但也不可能有別的方法訪問傳入到構造函數中的原始數據。 創建對象 1.Object構造函數 創建一個Object的實例,然為其添加屬性和方法(早期創建對象的模式) var person = new Object(); person.name = Nichol...
摘要:私有變量任何在函數中定義的變量,都可以認為是私有變量,因為在不能再函數的外部訪問這些變量。我們把有權訪問私有變量和私有函數的公有方法稱為特權方法。模塊模式模塊模式是為單例創建私有變量和特權方法。 私有變量 任何在函數中定義的變量,都可以認為是私有變量,因為在不能再函數的外部訪問這些變量。私有變量包括函數的參數、函數中定義的變量和函數。我們把有權訪問私有變量和私有函數的公有方法稱為特權方...
摘要:面向對象思維方式將復雜的問題簡單化。給對象起個名字。是類類型的變量。通過已有的對象調用該對象的功能。格式對象對象成員可以該對象的屬性賦值。這時會有兩個引用同時指向堆中的同一個對象。對象,用于描述現實中的個體,它是類的實例。 01面向對象和面向過程的思想 * A: 面向過程與面向對象都是我們編程中,編寫程序的一種思維方式 * a: 面向過程的程序設計方式,是遇到一件事時,思考我該...
摘要:首先導包依賴如下構建應用是以為中心的實例可以通過獲得其中是工廠接口任務用于創建配置文件將會解析配置文件在類對象中配置獲取數據源事務管理器映射器在文件下新建文件配置文件內容如下定義別名定義數據庫信息事物管理 首先導包 依賴如下 mysql mysql-connector-java 8.0.15 org.m...
閱讀 1660·2021-09-28 09:35
閱讀 1131·2019-08-30 15:54
閱讀 1657·2019-08-30 15:44
閱讀 3363·2019-08-30 14:09
閱讀 488·2019-08-29 14:05
閱讀 2662·2019-08-28 17:53
閱讀 1978·2019-08-26 13:41
閱讀 1710·2019-08-26 13:26