资讯专栏INFORMATION COLUMN

20170607-面向对象03-判断对象类型的方法

zhoutao / 1784人阅读

摘要:这种方法也存在这样的问题如果修改了构造函数的原型对象,之前创建的对象无法通过这种方式来确定类型修改构造函数的原型对象会导致之前创建的对象无法通过这种方式判断类型判断对象继承自哪些父类型使用使用

判断对象类型的方法 使用原型对象上的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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/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元查看
<