关于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 不解释。