首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何检查JavaScript对象是否直接是`{}`实例,而不是子类?

在JavaScript中,对象可以通过花括号 {} 创建。创建对象时,如果对象字面量不使用new关键字,而是直接使用花括号 {},那么创建的就是一个实例对象。如果对象字面量使用new关键字创建,那么创建的就是一个子类对象。如何检查JavaScript对象是否直接是{}实例,而不是子类?可以使用Object.getPrototypeOf()方法来检查对象的直接父类。如果对象直接是{}实例,那么Object.getPrototypeOf()方法返回null。如果对象是子类,那么Object.getPrototypeOf()方法返回该子类的原型对象。以下是示例代码:

代码语言:javascript
复制
function isObjectInstance(obj) {
  return Object.getPrototypeOf(obj) === null;
}

function isSubclassObject(obj) {
  return Object.getPrototypeOf(obj) !== null;
}

function testObject() {
  const obj1 = {};
  const obj2 = new Object();
  const obj3 = new Object();
  const obj4 = {};

  console.log(isObjectInstance(obj1)); // true
  console.log(isObjectInstance(obj2)); // false
  console.log(isObjectInstance(obj3)); // true
  console.log(isObjectInstance(obj4)); // true

  console.log(isSubclassObject(obj1)); // false
  console.log(isSubclassObject(obj2)); // true
  console.log(isSubclassObject(obj3)); // false
  console.log(isSubclassObject(obj4)); // false
}

testObject();

在上述示例代码中,isObjectInstance函数接受一个对象作为参数,如果该对象是直接使用花括号 {} 创建的实例对象,则返回true,否则返回falseisSubclassObject函数接受一个对象作为参数,如果该对象是子类,则返回true,否则返回false。在testObject函数中,我们使用四个不同的对象进行测试,包括直接使用花括号 {} 创建的实例对象和通过new Object()创建的子类对象。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Javascript对象如何检查key(键)是否存在

js中判断键是否存在? 看到这个问题,有的小伙伴可能第一个想法就是判断值是否为undefined。...兴兴冲冲地写下如下代码: var obj = {}; if(obj[key]==undefined){ //不存在 } 但是这种写法错误的,因为可能键存在的,但是值为undefined。...= undefined // 返回false,但是键存在的  in操作符 你应该使用in操作符来替换之前的操作,例: "key" in obj // 存在时返回true 注:   如果需要检查不存在,...需要添加括号,否则结果将不是我们预想的了。...Equivalent to "false in obj" hasOwnProperty方法 如果要特别测试对象实例的属性(不是继承的属性),请使用hasOwnProperty: obj.hasOwnProperty

25.2K50

如何高效检查JavaScript对象中的键是否存在

在日常开发中,作为一个JavaScript开发者,我们经常需要检查对象中某个键是否存在。这看似简单,但其实有多种方法可供选择,每种方法都有其独特之处。...本文将介绍几种检查JavaScript对象键的方法,并比较它们的性能。...} 直接访问一个不存在的键会返回undefined,但是访问值为undefined的键也是返回undefined。所以我们不能依赖直接键访问来检查是否存在。...然而,这种方法有几个缺点: 需要额外的操作(typeof)不是直接比较 比较冗长且需要否定检查(!...); } 这种方法只会返回对象自身拥有的键,不会检查继承的属性: 只检查自身键,不包括继承的 方法名清晰,容易理解 缺点hasOwnProperty需要方法调用,在性能关键的代码中可能会有影响。

10110
  • 是否还在疑惑Vue.js中组件的data为什么函数类型不是对象类型

    分析Vue.js组件中的data为何函数类型而非对象类型 引言 正文 一、Vue.js中data的使用 二、data为对象类型 三、data为函数 结束语 引言 要理解本篇文章,必须具备JavaScript...然后想在图上添加什么东西,只需要再创建一个文件,在该文件中创建一个Vue实例,但不通过el进行挂载,而是直接通过注册的方式,注册到另一个页面,作为别的页面的一部分,例如图中的样子。...李四 如果我们此时把实例对象vm2中的data.name 改为 王五,我们来看一下两个实例对象渲染的结果如何 //此处的name会调用实例对象vm1.data.name ...这是因为这两个实例对象在创建时,先获得了一个函数,将该函数的返回值作为了自己属性data的值,并且这两个实例对象中data的值在栈中对应的堆中的地址也不一样,所以他们不会互相影响。...因为本文也是说到构造函数创建实例对象的概念,如果对于JavaScript对象的概念不理解的话,也可以翻阅我之前写的一篇文章,全面剖析了js中的对象概念——充分了解JavaScript中的对象,顺便弄懂你一直不明白的原型和原型链

    3.4K30

    WPF 判断一个对象是否设计时的窗口类型,不是运行时的窗口

    当我们对 Window 类型写一个附加属性的时候,在属性变更通知中我们需要判断依赖对象是否一个窗口。但是,如果直接判断是否 Window 类型,那么在设计器中这个属性的设置就会直接出现异常。...所以通过判断这个值可以得知此时是否在设计器中使用此附加属性。...不过,如果我们希望得到更多的设计器支持,不是像上面那样直接 return 导致此属性在设计器中一点效果都没有的话,我们需要进行更精确的判断。...17 18 19 20 21 22 23 24 25 public static class WalterlvDesignTime { /// /// 判断一个依赖对象是否设计时的...return true; } } return false; } } 于是,只需要调用一下这个方法即可得到此窗口实例是否设计时的窗口

    30340

    《现代Typescript高级教程》结构化类型

    这就是鸭子类型的基本概念:只要一个对象的结构满足了接口的要求,我们就可以把这个对象看作这个接口的实例不管这个对象的实际类型是什么。 2....这使得我们可以更容易地编写通用的代码,因为我们的代码只依赖于对象的结构,不是对象的具体类型。 2.2 代码的复用 鸭子类型有助于代码的复用。...由于 JavaScript 一种动态类型语言,我们经常需要处理的对象可能没有明确的类型。鸭子类型使我们能够在 TypeScript 中安全地处理这些对象,只要它们的结构满足我们的需求。...因为 TypeScript 的类型检查器只检查对象是否满足接口的结构,检查对象是否真的接口所期望的类型。...3.2 易读性和可维护性 鸭子类型可能会降低代码的易读性和可维护性。因为我们的代码只依赖于对象的结构,不是对象的具体类型,这可能会使代码更难理解和维护。

    30910

    语言设计中的鸭子类型风格

    在动态语言设计中,可以解释为无论一个对象是什么类型的,只要它具有某类型的行为(方法),则它就是这一类型的实例不在于它是否显示的实现或者继承。      鸭子类型在动态语言中被广为奉行。...java,c#这类静态强类型语言(当前首先声明c#已经不是纯的静态强类型语言,它具有dynamic,表达式,当然这里所说的c#去掉这类特性,或者说C#2.0吧)我们传入的对象是必须显示实现该接口的类实例...(I).Get() }    Go语言不同于其他鸭子类型语言的它实现了在编译时期检查,同时也不失这种自由度。    ...另外TypeScript想必你也知道 ,这与google的dart一样致力于将javascript带入大规模开发的语言,不同的TypeScriptjavascript的超集,并不是重造一门新语言。...他为javascript引入的接口,类型,泛型等较完备的类型系统,是的能够有更好的IDE支持,从某种程度上来说,这是对鸭子类型或者javascript编译器的检查推迟的弥补。

    80870

    JavaScript 实践+理论(总结篇):作用域、闭包、this、对象原型

    会将当前对象的引用当做作用域来处理,将对象中的属性当做作用域中的标识符来处理,从而创建一个新的词法作用域。 附录 A 动态作用域 • 作用域基于调用栈的,不是代码中的作用域嵌套的。...判断一个属性是否对象的可枚举属性中: xxx.propertyIsEnumerable('xxxx') 5. in 操作符会检查属性是否对象及其 [[Prototype]] 原型链中, hasOwnProperty...(),propertyIsEnumerable() 只会检查属性是否在某个对象中,不会检查 [[Prototype]] 原型链。...一个类就是一个蓝图,也就只是一个计划,并不是真正可以交互的对象,必须通过实例对象来调用所有的特性,实例对象就是类的所有特性的一个副本。 4. 在类被继承时,行为也会被复制到子类中。...行为委托认为对象之间兄弟关系,不是父类与子类的关系,两者相互委托。 JavaScript 中的 [[Prototype]] 机制本质上就是委托机制。

    8610

    「思维导图学前端 」一文搞懂Javascript对象,原型,继承

    ; } 实例抽象的概念,相当于一个模板,实例类的具体表现。...在javascript中,对象属性查询非常灵活,支持点号查询,也支持字符串索引查询(之所以说是“字符串索引”,是因为写法看起像数组,索引字符串不是数字)。...属性名javascript标识符,必须直接写在属性访问表达式中,不能动态访问。...缺点:子类实例不是父类的实例,无法继承父类原型属性。 组合继承 所谓组合继承,就是综合上述两种方法。...Object.getPrototypeOf获取目标对象直接原型,返回的目标对象的原型对象 PropertyIsEnumerable 该方法返回一个布尔值,表示指定的属性是否可枚举。

    74420

    【THE LAST TIME】一文吃透所有JS原型相关知识点

    instanceof 的基本用法,它可以判断一个实例是否其父类型或者祖先类型的实例。...prototype对父类实例化,继承了父类,所以说父类中如果共有属性引用类型,就会在子类中被所有的实例所共享,因此一个子类实例更改子类原型从父类构造函数中继承的共有属性就会直接影响到其他的子类 由于子类实现的继承靠其原型...寄生组合式继承 回到之前的组合式继承,那时候我们将类式继承和构造函数继承组合使用,但是存在的问题就是子类不是父类的实例子类的原型父类的实例,所以才有了寄生组合式继承 寄生组合式继承寄生式继承和构造函数继承的组合...上述代码就比较简单了,_classCallCheck的作用就是检查 Person 这个类,是否通过new 关键字调用的。...如果实例属性,直接赋值到 this 上,如果静态属性,则赋值类上。_defineProperty也就是来判断下是否属性名重复而已。 添加方法 ?

    1K10

    《你不知道的JavaScript》:深入Promise的链式调用

    在使用Promise时,一个很重要的细节如何确定值是不是真正的Promise,或者说它是不是一个行为方式类似于Promise的值?...原因很多,最主要的Promise值可能从其他浏览器窗口(iframe等)接收到的。这个浏览器窗口自己的Promise可能和当前窗口/frame的不同,所以这样的检查无法识别Promise实例的。...另外,有些库或者框架也有可能会选择实现自己的Promise,不是使用原生的ES6 Promise来实现。...比较好的识别方法通过鸭子类检查来判断是否为Promise值。即根据一个值的形态(具有哪些属性)对这个值的类型做出一些假定。...所以对thenable值的鸭子类检查就大致类似于这样实现: // promise对象的鸭子类型判断 function promiseDuckCheck(p) { if( p!

    75340

    TypeScript手记(三)

    TypeScript 的核心原则之一对值所具有的结构进行类型检查。它有时被称做“鸭式辨型法”或“结构性子类型化”。...需要注意的,我们传入的对象参数实际上会包含很多属性,但是编译器只会检查那些必需的属性是否存在,以及其类型是否匹配。然而,有些时候 TypeScript 却并不会这么宽松,我们下面会稍做讲解。...可以同时使用两种类型的索引,但是数字索引的返回值必须字符串索引返回值类型的子类型。这是因为当使用 number 来索引时,JavaScript 会将它转换成string 然后再去索引对象。...它不会帮你检查是否具有某些私有成员。 类静态部分与实例部分的区别 当你操作类和接口的时候,你要知道类具有两个类型的:静态部分的类型和实例的类型。...Button和 TextBox 类 SelectableControl 的子类(因为它们都继承自Control 并有 select 方法),但 ImageC 类并不是这样的。

    89720

    JavaScript 类完整指南

    本文使你熟悉 JavaScript 类:如何定义类,初始化实例,定义字段和方法,了解私有字段和公共字段,掌握静态字段和方法。...实例一个包含类描述的数据和行为的对象。 ? JavaScript实例 new 运算符可在 JavaScript实例化该类:instance = new Class()。...如果新值一个空字符串,则 setter 将引发错误。 4.3静态方法 静态方法直接附加到类的函数。它们具有与类相关的逻辑,不是与类的实例相关的逻辑。...对象类型检查:instanceof object instanceof Class 确定 object 是否为 Class 的实例的运算符。...空对象 {} 不是 User 的实例,对应的 obj instanceof User false。 instanceof 多态的:操作符将一个子类检测为父类的实例

    98820

    typescript基础篇(7):类型检查机制

    类型检查机制 所谓类型检查机制,就是编程语言编译器在做类型检查时,所秉持的原则,以及表现出的行为。 ?...如果我不写foo.bar=1,这里的检查就漏过去了。建议直接注解foo: let foo: Foo = { bar: 1, } 所以,不要滥用断言。..."——在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。 只要Y接口具备X接口的所有必要成员,那么X就兼容Y(成员少的兼容成员多的)。...为此,总结的规律: •结构之间:成员少的兼容成员多的•函数之间:参数多的兼容成员少的 7.3 类型保护 先看个例子: 我们用枚举类型实现一个语言选择方法,逻辑判断是否强类型,则执行helloJava...7.3.1 instanceof Instanceof可以判断一个对象是否属于某种类型的实例

    1.5K20

    TypeScript 官方手册翻译计划【十二】:类

    通常情况下,最好将索引数据存储在另一个位置,不是实例本身。 类继承 和其它面向对象语言一样,JavaScript 中的类可以继承自基类。...只拥有单个实例的类在 JavaScript/TypeScirpt 中通常用一个普通对象表示。...在这个例子中,由于我们通过 obj 引用去调用函数,所以它的 this 的值 obj,不是实例。 这通常不是我们期望的结果!...这种方法的利弊权衡和上面使用箭头函数的方法相反: JavaScript 的调用方可能仍然会在没有意识的情况下错误地调用类方法 只会给每个类定义分配一个函数,不是给每个类实例分配一个函数 仍然可以通过...这些成员必须存在于一个无法直接实例化的抽象类中。 抽象类的角色充当一个基类,让其子类去实现所有的抽象成员。当一个类没有任何抽象成员的时候,我们就说它是具体的。

    2.6K10

    一文带你彻底搞懂JavaScript原型链

    实际上在JavaScript中,有许多特殊的对象子类型,可以叫做复杂基本类型。 函数就是对象的一个子类型。 函数的本质就是对象。 但是为什么使用typeof进行类型检查的时候会有下面的结果呢?...__proto__); //null // 2.Function.prototype的原型对象为Object.prototype不是它自己 console.log...__proto__ == Function.prototype); //true 4 原型链的访问规则 就近原则 对象在访问属性或方法时,先检查自己的实例,如果存在就直接使用。...__proto__)); // true isPrototypeOf方法用于检查对象是否在指定对象的原型链中。...console.log(Object instanceof Function); //true 注意:不要错误的认为instanceof检查实例对象是否从当前构造函数实例化创建的,其实它检查实例对象是否从当前指定构造函数的原型对象继承属性

    35121

    Prototype (原型)

    使用 in 操作符来检查属性在对象是否存在时,同样会查找对象的整条原型链(无论属性是否可枚举 ): var anotherObj = { a: 2 }; var myObj = Object.create...在 JavaScript 中,没有类似的复制机制。你不能创建一个类的多个实例,只能创建多个对象,它们 [[Prototype]] 关联的同一个对象。...无论添加什么标签都无法改变事实 :一种水果苹果,另一种橘子。更好的方法直接把苹果叫作苹果——使用更加准确并且直接的术语。 继承 意味着复制操作,JavaScript (默认)并不会复制对象属性。...Foo(); # 检查 “类” 关系 a instanceof Foo; // true instanceof 回答的问题:在 a 的整条 [[Prototype]] 链中是否有指向 Foo.prototype...在构造完成后,你通常只需要操作这些实例不是类),因为每个实例都有你需要完成任务的所有行为。 # 委托理论 使用委托行为 不是类来思考同样的问题。

    35820

    简单的JavaScript继承

    ; // 复制属性到新的原型上 for (var name in prop) { // 检查我们是否覆盖了一个已经存在的方法 prototype[name] =...子类实例化 为了用函数原型模拟继承,我们使用传统的创建父类的实例,并将其赋值给子类的原型。...Person(); // Allows for instanceof to work: (new Ninja()) instanceof Person 该代码的挑战在于我们想从 instanceof中受益,不是实例化...在合并过程中我们做了简单的检查子类属性是否一个函数、超类属性是否一个函数、子类函数是否包含了 super引用。 注意,我们创建了一个匿名的闭包(返回了一个构造函数),将会封装并执行子类的函数。...值得庆幸的,我们不需要做任何额外的代码修改或者作用域的修改,当函数成为我们对象的一个属性时,该函数的上下文会自动设置( this引用的当前的子类实例不是父类实例)。

    58820

    已阅冴羽大佬文章

    函数就是对象的一个子类型,JavaScript中的函数“一等公民”,因为它们本质上和普通的对象一样,所以可以像操作其他对象一样操作函数。...[[Prototype]]原型链中 hasOwnProperty(...)只会检查属性是否在myObject对象中,不会检查[[Prototype]]链 枚举 示例: var myObject =...(myObject); // ["a"] Object.getOwnPeropertyNames(myObject); // ["a", "b"] propertyIsEnumerable(...)会检查给定的属性名是否直接存在于对象中...JavaScript 专题之如何判断两个对象相等 构造函数,类的继承,混入 构造函数:类实例由一个特殊的类方法构造的,这个方法名通常和类名相同,称为构造函数。...几乎所有的对象在创建时[[Prototype]]属性都会被赋予一个非空的值。 使用in操作符来检查属性在对象是否存在时,同样会查找对象的整条原型链。

    92820

    混合设计“类”

    类似地,你通常也不会使用一个实例对象直接访问并操作它的类,不过至少可以判断出这个实例对象来自哪个类。 把类和实例对象之间的关系看作直接关系不是间接关系通常更有助于理解。...子类会包含父类行为的原始副本,但是也可以重写所有继承的行为甚至定义新行为。非常重要的一点,我们讨论的父类和子类不是实例。...这似乎一个过于深入的学术细节,但是只有理解了这个细节才能理解JavaScript中类似(但是并不相同)的[[Prototype]]机制。 在子类不是它们创建的实例对象!)...但是如果直接执行 Vehicle.drive(),函数调用中的 this 会被绑定到 Vehicle 对象不是Car 对象(参见第 2 章),这并不是我们想要的。...最终的结果 Something.cool() 中的赋值操作都会应用在 Another 对象不是Something 对象上。

    17620
    领券