shm*_*uli 1 javascript inheritance hasownproperty
我的理解是该Object.hasOwnProperty方法检查对象是否具有自己的属性名称,这意味着非继承属性.这意味着只要属性a,函数就应该返回false .不存在,或b.如果它是继承的.
如果我错了,请纠正我,但除非这不使用经典继承,否则不会bar继承Foo下面的代码?hasOwnProperty当propname属性是继承属性时,为什么方法返回true ?我在这里弄错了什么?
另外,我怎么会用hasOwnProperty的上的Foo对象?false检查Foo对象时,此处返回代码.
function Foo() {
this.propname = 'test';
}
var bar = new Foo();
console.log(bar.hasOwnProperty('propname')); // returns true
console.log(Foo.hasOwnProperty('propname')); // returns false
Run Code Online (Sandbox Code Playgroud)
这里的绊脚石是Javascript使用原型继承.你所看到的实际上根本没有继承.
hasOwnPropertyfalse如果财产将返回:
代码中的"类"与继承无关,它只是一个在对象上设置某些属性的函数.
该对象恰好是一个新的空对象的实例,因为您使用new关键字调用了该函数,这可能是混淆的来源.
想象一下,将函数重写为:
function foo() {
var bar = {};
bar.propname = 'test';
return bar;
}
var baz = foo();
Run Code Online (Sandbox Code Playgroud)
你期望baz.hasOwnProperty('propname')回归真实吗?当然,因为我们在对象上明确定义了属性.
声明属性的另一种方法是在Foo原型上声明它.
function Foo() {
this.bar = 'baz';
}
Foo.prototype.propname = 'test';
var baz = new Foo();
baz.propname; // 'test'
baz.hasOwnProperty('propname'); // false
Run Code Online (Sandbox Code Playgroud)
同样,这里发生的神奇事情都归结为new关键字.当您使用函数调用函数时,new将该值指定this为新对象,并将该对象的原型设置为与您调用的函数的原型相同.
也许最简单的解释hasOwnProperty方法是有一个方法bar,但如果你打电话bar.hasOwnProperty('hasOwnProperty')它会返回false.
这是因为该hasOwnProperty方法位于原型链的最顶端Object.prototype.Javascript中的每个对象都从这里继承,这就是为什么每个对象都有一个hasOwnProperty方法.
有一篇很好的文章说明为什么new在Javascript中使面向对象编程变得困难.