我给一个函数赋一个属性,并使用这个函数作为构造函数,如下所示:
function h(){this.a='abc';}
h.high='2.0';
var hinst=new h();
function hasPrototypeProperty(object, name){
return !object.hasOwnProperty(name) && (name in object);
}
console.log(h.hasOwnProperty('high')); //true
console.log(hinst.hasOwnProperty('high'));//false
console.log(hasPrototypeProperty(hinst, 'high'));//false
console.log('a' in hinst); //true
console.log('high' in hinst);//false
console.log(hinst.prototype.constructor.high); //exception
非常奇怪,在我的测试中,'高'既不是实例属性
hinst.hasOwnProperty)
或原型属性
hasPrototypeProperty(HINST,'高&#39)
最后一行抛出一个异常说
TypeError:无法读取属性'构造函数'未定义的
我想我对财产有一些不理解,怎么可能' hinst'访问' high'属性?
答案 0 :(得分:1)
此处h
是function
类型的对象,您为其指定了名为property
的{{1}}。所以它与实例或原型无关。
答案 1 :(得分:1)
让我们稍微分解一下。
这里创建了一个构造函数。它们旨在与new
运算符一起使用。一个广泛的惯例是将第一个字母大写以使该意图显而易见。
function H(){ this.a='abc'; }
当使用new
调用构造函数时,会出现类似的情况:
(function(){
var o = Object.create( H.prototype );
H.apply( o, arguments );
return o;
}());
您基本上最终会得到一个从{ a: 'abc' }
对象继承的新对象(H.prototype
)。也就是说,它的'内部[[Prototype]]
属性 1 指向它。
H.prototype
最初是一个具有单个属性的对象(constructor
,指向构造函数H
),但您可以自由地替换或扩展它。你可能想用这一行做什么:
H.high='2.0';
但是,您将属性添加到构造函数H
(函数也是对象)。
console.log( H.hasOwnProperty('high') ); //true
console.log( (new H()).hasOwnProperty('high') ); //false
console.log( (new H()).hasPrototypeProperty('high') ); //false
更正示例。
function H(){ this.a='abc'; }
H.prototype.high='2.0';
var hinst = new H();
function hasPrototypeProperty(object, name){
return !object.hasOwnProperty(name) && (name in object);
}
console.log(H.hasOwnProperty('high')); //false
console.log(hinst.hasOwnProperty('high')); //false
console.log(H.prototype.hasOwnProperty('high')); //true
console.log(hasPrototypeProperty(hinst, 'high')); //true
console.log('a' in hinst); //true
console.log('high' in hinst); //true
console.log(H.prototype.high); //2.0
console.log(hinst.high); //2.0

答案 2 :(得分:0)
构造函数和原型之间的代码存在一些混淆
console.log(inst.prototype.constructor.high); // exception
console.log(inst.constructor.high); // '2.0'
因为你的构造函数不是原型链的一部分。
在构造函数之后定义属性后的属性(只是
功能)然后你最终得到这个
function h () {
this.a='abc';
}
h.high='2.0';
console.log(h);
// => { [Function: h] high: '2.0' }
弗兰肯斯坦函数 - 对象怪物。