国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

20170607-面向對象03-判斷對象類型的方法

zhoutao / 1915人閱讀

摘要:這種方法也存在這樣的問題如果修改了構造函數的原型對象,之前創建的對象無法通過這種方式來確定類型修改構造函數的原型對象會導致之前創建的對象無法通過這種方式判斷類型判斷對象繼承自哪些父類型使用使用

判斷對象類型的方法 使用原型對象上的constructor屬性來判斷
每個對象的原型上都有一個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

修改構造函數的原型對象會導致之前創建的對象無法通過這種方式判斷類型

判斷對象繼承自哪些父類型 使用instanceof
instance 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

相關文章

  • 20170607-面向對象02-繼承

    摘要:繼承原型鏈原型鏈是實現繼承的主要方法。臨時的構造函數將傳入的對象作為這個構造函數的原型返回新實例以為原型創建一個新實例不僅屬于所有,而且也會被共享。上訴例子只調用了一次構造函數,因此避免了在上面創建不必要的多余的屬性。 繼承 1 原型鏈 原型鏈是實現繼承的主要方法。其基本思想是利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。 構造函數、原型和實例的關系 每個構造函數都有一個原型對...

    lushan 評論0 收藏0
  • 20170607-面向對象01-創建對象

    摘要:原型對象的問題省略了為構造函數傳遞參數,導致了所有實例在默認情況下都取得相同的屬性值。即使有其他代碼會給這個對象添加方法或數據成員,但也不可能有別的方法訪問傳入到構造函數中的原始數據。 創建對象 1.Object構造函數 創建一個Object的實例,然為其添加屬性和方法(早期創建對象的模式) var person = new Object(); person.name = Nichol...

    NusterCache 評論0 收藏0
  • 20170607-私有變量

    摘要:私有變量任何在函數中定義的變量,都可以認為是私有變量,因為在不能再函數的外部訪問這些變量。我們把有權訪問私有變量和私有函數的公有方法稱為特權方法。模塊模式模塊模式是為單例創建私有變量和特權方法。 私有變量 任何在函數中定義的變量,都可以認為是私有變量,因為在不能再函數的外部訪問這些變量。私有變量包括函數的參數、函數中定義的變量和函數。我們把有權訪問私有變量和私有函數的公有方法稱為特權方...

    trilever 評論0 收藏0
  • 1、面向對象 2、類與對象 3、局部變量和成員變量關系 4、封裝思想 5、private,this

    摘要:面向對象思維方式將復雜的問題簡單化。給對象起個名字。是類類型的變量。通過已有的對象調用該對象的功能。格式對象對象成員可以該對象的屬性賦值。這時會有兩個引用同時指向堆中的同一個對象。對象,用于描述現實中的個體,它是類的實例。 01面向對象和面向過程的思想 * A: 面向過程與面向對象都是我們編程中,編寫程序的一種思維方式 * a: 面向過程的程序設計方式,是遇到一件事時,思考我該...

    dreamtecher 評論0 收藏0
  • mybatis 入門搭建

    摘要:首先導包依賴如下構建應用是以為中心的實例可以通過獲得其中是工廠接口任務用于創建配置文件將會解析配置文件在類對象中配置獲取數據源事務管理器映射器在文件下新建文件配置文件內容如下定義別名定義數據庫信息事物管理 首先導包 依賴如下 mysql mysql-connector-java 8.0.15 org.m...

    enali 評論0 收藏0

發表評論

0條評論

zhoutao

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<