函数实例hasOwnProperty()混淆

时间:2014-01-10 15:09:33

标签: javascript

由于doOtherStuff函数直接在b实例上定义,而不是在原型链中的“上方”(例如在base甚至Object上),为什么b.hasOwnProperty('doOtherStuff')会返回false?

var base = (function () {

    var cls = function () { };

    cls.prototype.doStuff = function () {
        console.log('dostuff');
    };

    return cls;

})();

var child = (function () {

    var cls = function () {
        base.call(this);
    };

    cls.prototype = Object.create(base.prototype);
    cls.prototype.constructor = child;

    cls.prototype.doOtherStuff = function () { // <--
        console.log('doOtherStuff');
    }

    return cls;

})();

var b = new child();

console.log(b.hasOwnProperty('doOtherStuff'), 'doOtherStuff' in b); //false true

http://jsfiddle.net/5FzBQ/

2 个答案:

答案 0 :(得分:3)

  

由于doOtherStuff函数直接在b实例

上定义

那不是真的;您在cls.prototype

中定义了该属性 如果您撰写hasOwnProperty()(或this.property = ...),

b.property将仅返回true。

答案 1 :(得分:1)

doOtherStuff未直接在b上定义,b从其原型继承doOtherStuffhasOwnProperty区分直接在对象上定义的属性与从原型继承的属性,而in则没有。

请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty