关于javascript,以下选项描述错误的是:
A 在原型上扩展的可枚举方法,会被for in循环出来
B 使用object.defineProperty可向对象添加或者修改属性
C 每个对象都有prototype属性,返回对象类型原型的引用
D 通过hasOwnProperty可判断一个对象以及其原型链上是否具有指定名称的属性
E 原型链是JS实现继承的一种模型
F for循环是按顺序的,for in 循环是不一定按顺序的
牛客网给出答案是D,但是我感觉这道题争议性很大,本着积累知识为主要目的,在这里先不给出标准答案(也许根本没有)
解析:
A和F涉及到for-in的特性,可以参考我前面的文章JS中的for-in和for-of语句 B积累一个新方法,Object.defineProperty()
会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。来看一个实例:
var arr = {
name: '小明',
age: 11
};
Object.defineProperty(arr, 'color', {
value: 'black'
});
Object.defineProperty(arr, 'age', {
value: 12
});
console.log(arr.color);//black
console.log(arr.age);//12
使用该方法可以在arr对象上增加新属性color,也可以修改属性值age,需要主要的是花括号与关键字value
不可以省略,如果对象中含有子对象,可以这样来修改:
var arr = {
name: '小明',
age: 11,
family :{
mom : 49,
dad : 47
}
};
Object.defineProperty(arr, 'family', {
value :{
mom : 50,
dad : 48
}
});
console.log(arr.family);
但是这里的Object
写成了object,JS对大小写是很敏感的,在本地尝试了一下,报错:
ReferenceError: object is not defined
是排版问题还是其他问题也无从考证了。
C 这个选项在很多题中都出现过,有的被视为正确,有的被视为错误,确实大多数对象具备prototype
属性,可以返回对象原型(这又是什么表达方式,何为对象类型原型。。。)但是有一种除外,代码展示:
var obj = Object.create(null)
console.log(obj)
可以即刻在控制台输出一下,结果如下:
由于obj他的原型是null,所以obj是没有prototype属性的。
D 可能是该选项错得很明显,所以牛客网的参考答案是D,hasOwnPropertyI()
是用来检测给定的属性是否在当前对象的实例中,但是无法检测原型。
E 不解释。