这个javascript属性是实例属性,还是原型属性?

时间:2016-08-12 09:22:27

标签: javascript constructor properties prototype instance

我给一个函数赋一个属性,并使用这个函数作为构造函数,如下所示:

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'属性?

3 个答案:

答案 0 :(得分:1)

此处hfunction类型的对象,您为其指定了名为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




1 Inheritance and the prototype chain at MDN

答案 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' }

弗兰肯斯坦函数 - 对象怪物。