首页 > 试题广场 >

以下关于JavaScript的描述中错误的是

[不定项选择题]
以下关于JavaScript的描述中错误的是
  • 在原型上扩展的可枚举方法,会被for in循环出来
  • 使用object.defineProperty可向对象添加或者修改属性
  • 每个对象都有prototype属性,返回对象类型原型的引用
  • 通过hasOwnProperty可判断一个对象以及其原型链上是否具有指定名称的属性
  • 原型链是JS实现继承的一种模型
  • For循环是按顺序的,for in 循环是不一定按顺序的

自己的一些思考

B、C、D 都是错误的。

B:使用object.defineProperty可向对象添加或者修改属性

这里是小写的object而非Object,所以错误。

C: 每个对象都有prototype属性,返回对象类型原型的引用

var obj = Object.create(null)
console.log(obj)

如果使用 chrome 浏览器控制台输入上面代码,可以看到打印了一个空对象,展开看到No Properties,而随便自己用字面量声明一个对象,都能看到proto属性。

所以,不是每个对象都有prototype属性。后面这句,严格来说是不是每个对象都会返回Object.prototype?,但实际应该是这个对象的原型的引用,加个“类型”是什么意思,所以这个选项考点到底是第一句话还是第二句话?

D: 通过hasOwnProperty可判断一个对象以及其原型链上是否具有指定名称的属性

这个很明显,从该方法名称就能看出,所以是无法判断原型链上是否有的。在《你不知道的 JavaScript》(上卷) p119 也提到了这个:

相比之下, hasOwnProperty(..) 只会检查属性是否在myObject 对象中,不会检查[[Prototype]] 链。

E 和 F

都不敢相信网站的答案了。。。这两个到底是对的还是错的,求解答。

编辑于 2017-02-08 14:27:54 回复(26)
所有对象都有__proto__,所有函数对象都有prototype
发表于 2017-03-08 23:52:34 回复(10)
hasOwnProperty方法是用来检测给定的属性是否在当前对象的实例中。
发表于 2017-07-23 10:40:24 回复(0)
 for...in:遍历对象的每一个可枚举属性,包括原型链上面的可枚举属性;
Object.keys():只遍历自身的可枚举属性,不可以遍历原型链上的可枚举属性;
Object.getOwnPropertyNames():遍历自身所有属性(不论是否是可枚举的);不包括原型链。
发表于 2019-02-25 11:06:33 回复(0)
所有继承了 Object 的对象都会继承到 hasOwnProperty 方法。这个方法可以用来检测一个对象是否含有特定的自身属性;和 in 运算符不同,该方***忽略掉那些从原型链上继承到的属性。所以A对D错
B:应该是Object.defindeProperty是给对象添加或修改属性的方法,Object是js的内置对象,而object是一个变量名,这一点还是有区别的,题目不够严谨吧
C:创建的每一个函数都有一个prototype(原型)属性。浏览器实现的访问对象的[[prototype]]内部属性的方式是__proto__属性。
var obj = Object.create(null)
console.log(obj)
这个方式是以null为原型创建的对象,然而null并没有原型对象,所以这样创建出来的对象也没有原型对象,所以obj没有__proto__属性。
F:红宝书上说道“for-in循环出的属性名顺序是不可预测的,返回的先后次序会因浏览器而异”
发表于 2019-01-10 11:46:42 回复(0)
var obj=Object.create(null)
obj他的原型是null,所以obj是没有prototype属性的
发表于 2017-03-15 20:19:46 回复(6)
每个对象确实都有__ptoto__属性,但prototype属性不是函数对象特有的吗,怎么好多人举这个例子来说明不是所有对象都有prototype属性:
var obj=Object.create(null);

发表于 2017-09-10 22:05:40 回复(1)
MDN 原话。-----------------所有继承了 Object 的对象都会继承到 hasOwnProperty 方法。这个方法可以用来检测一个对象是否含有特定的自身属性;和 in 运算符不同,该方***忽略掉那些从原型链上继承到的属性。----------------牛客网的答案真的是。。。不敢相信啊
发表于 2017-02-13 15:31:43 回复(4)

关于F选项,昨天才复习的javascript语言精粹里说的,for in 遍历对象,无序遍历,而且会遍历原型,如果不想看到不要的属性,一定要if判断

发表于 2019-10-28 08:43:29 回复(0)
注意 Object.defineProperty(obj, prop, descriptor) 方法,
作用:直接在这个对象上获取,或者修改,创建一个属性, 并返回当前对象
obj : 为要修改的对象
prop:为要修改的或者创建的属性名
descriptor : 为要创建或者修改的键值对,注意,要修改的或者增加的那个属性值要是value
例子:
let obj = new Object();
Object.defineProperty(obj, 'name', {value : "你好“})
obj.name => 你好

发表于 2020-11-18 12:02:52 回复(0)
关于c对象的没有prototype;的,该方法不能得到原型上的属性和方法名
发表于 2016-12-15 00:23:15 回复(0)
hasOwnProperty()方法可以检测一个属性是存在于实例中,还是存在于原型中,这个方法是从Object继承来的。使用该方法只在给定属性存在实例对象中才会放回true
当属性来自于实例返回true
当属性来自于原型返回false
所以D错
在ECMAScript5中,prototype属性是不可枚举的,因此使用for-in无法实现
发表于 2018-03-11 23:34:27 回复(0)
hasOwnProperty:用来判断一个对象是否有你给出的名称的对象或属性
isProtypeOf:用来判断要检查其原型链的对象是否存在于指定对象实例中
发表于 2021-05-31 23:40:39 回复(0)
  • 每个对象都有prototype属性,返回对象类型原型的引用
    这句话本身就是错的,对象有__proto__属性。prototype是函数才有的属性,对象没有
    
发表于 2020-04-01 10:09:32 回复(0)
hasOwnprototype不能判断原型链上是否有指定名称的属性
编辑于 2019-12-16 18:45:40 回复(0)
C?只有函数对象才有prototype属性
发表于 2018-08-05 00:28:31 回复(0)
每个对象都有prototype属性,这是对的,至于后面那句就是个病句都不知道要表达什么
发表于 2022-09-30 17:09:29 回复(1)
hasOwnProperty表示是否有自己的属性。这个方***查找一个对象是否有某个属性,但是不会去查找它的原型链。
发表于 2022-07-22 17:42:22 回复(0)
每个对象都有__proto__属性,其对应的构造函数都有prototype属性,对象的__proto__和构造函数对应的prototype是一个东西;C错误;
hasOwnProterty判断是对象自身具有的某些属性,从原型链上面继承的不算

发表于 2022-07-13 20:39:52 回复(0)
F:
遍历顺序是对象属性的枚举顺序,并不一定按数组的下标顺序遍历
感觉答案有误
编辑于 2022-04-20 19:39:57 回复(0)