20170607-面向对象03-推断对象范例的要领

推断对象范例的要领

运用原型对象上的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
    原文作者:jhhfft
    原文地址: https://segmentfault.com/a/1190000009687350
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞