Javascript 当对照父对象属性进行检查时,hasOwnProperty返回true
我的JavaScript代码:Javascript 当对照父对象属性进行检查时,hasOwnProperty返回true,javascript,prototypal-inheritance,hasownproperty,coding-efficiency,Javascript,Prototypal Inheritance,Hasownproperty,Coding Efficiency,我的JavaScript代码: console.clear(); 函数基类(nname){ var name=nname; this.bc_PublicProperty=“DefaultValue_BaseClass”; this.bc_getName=函数getName(){ 返回名称; }; this.bc_setName=函数setName(nname){ name=nname; }; } 函数子类(nname){ 基类调用(this,nname); this.sc_PublicProp
console.clear();
函数基类(nname){
var name=nname;
this.bc_PublicProperty=“DefaultValue_BaseClass”;
this.bc_getName=函数getName(){
返回名称;
};
this.bc_setName=函数setName(nname){
name=nname;
};
}
函数子类(nname){
基类调用(this,nname);
this.sc_PublicProperty=“DefaultValue_SubClass”;
this.sc_getName=函数getName(){
返回名称;
};
this.sc_setName=函数setName(nname){
name=nname;
};
}
SubClass.prototype=Object.create(BaseClass.prototype);
SubClass.prototype.constructor=子类;
var bc=新基类(“Anton”);
var sc=新的子类(“Bernd”);
log(“对子类对象'sc'的hasOwnProperty检查对于方法'bc_getName'返回true”);
用于(sc中的var pro){
log(“Is”+pro+”子类的own属性:-->“+Object.hasOwnProperty.call(sc,pro));
}
检查您是否正在调用基类。在子类的构造函数上调用(this)
,这意味着您正在将基类
属性和函数添加到子类
实例中,因为此
是子类
的实例
这就是为什么hasOwnProperty
为所有属性返回true
错误的原型。。。
归根结底,您没有利用JavaScript中的原型
必须是某个原型的任何实例的一部分的函数应该在原型本身中定义
var A = function() {};
A.prototype = {
doStuff: function() {}
};
实际上,在构建期间定义函数的唯一好处是确保对象始终定义一些函数/属性,但在对象已经创建之后,就可以确保这一点
对我来说,以下定义属性的方法之间存在非常小的差异:
var A = function() {};
var instance = new A();
instance.text = "Hello, World!";
// or...
var A = function() {
this.text = "Hello, World!";
};
var instance = new A();
第一个代码示例在调用构造函数后定义了text
属性,而第二个示例在构造函数内部定义了该属性,但在这两种情况下,this
或instance
都是对同一对象的引用(即a
的实例)
使用原型,您可以确保从某个构造函数创建的所有对象都将共享相同的成员,并且这些成员将使用继承和使用
关于OP的更新。。。
OP说了很多话,但他说:
[…]我现在必须调整一下我的问题:我什么时候需要
hasOwnProperty,如果实际上应该声明公共道具/功能
在原型上,这反过来将所有输出
Object.hasOwnProperty(obj,“prop/func”)-->false。给我一个用例,
当它有意义时,使用hasOwnProperty
你走错方向了。。。为什么要问自己什么时候需要hasOwnProperty
?问问自己什么时候需要可重用性较差的简单对象,或者什么时候需要实际的可重用性hasOwnProperty
与此问题无关
使用文字对象时(即使用{}
语法声明为原样的对象)?当您需要字典、参数映射、值对象。。。这里您喜欢hasOwnProperty
,因为您的代码接收参数通常如下所示:
function X(uri, options) {
if(typeof options != "undefined") {
// For example, we set a default value if options has no
// mimeType property...
options.mimeType = options.hasOwnProperty("mimeType") ? options.mimeType : "application/json";
}
}
何时使用原型来使用复杂对象?当您定义行为并且需要在您的应用程序甚至多个应用程序中重用它时,您还需要在通用需求之上添加更多行为(hello继承)
关于为什么使用hasOwnProperty
。。。
OP说:
但是,如果你想查看数据,为什么要在这里使用“hasOwnProperty”
财产的存在?不应该是:options.mimeType吗=
options.mimeType | |“application/json”
互联网上有很多代码在做'options.mimeType'=
options.mimeType | |“application/json”,对,因为在JavaScript中
undefined的计算结果为
false(如果
options不拥有
mimeType属性返回
undefined`)
依我的拙见,我会使用hasOwnProperty
,因为它返回一个boolean
,如果它存在,或者它存在并且作为值未定义
例如,选项可以定义为{mimeType:undefined}
,有时您想知道属性是否存在,即使它的值为undefined
。undefined
asfalse
处理未定义的情况,无论它是否存在,都执行X,并且hasOwnProperty
是我想要确保它是否具有该属性
那么为什么我要使用选项.hasOwnProperty
而不是其他方法呢?。简单:因为,既然语言提供了一个工具来验证某个对象中是否存在属性,为什么我需要一个技巧object.hasOwnProperty
返回true
或false
,并且我确定该属性是否存在,即使该属性有未定义的值
使用options.hasOwnProperty(“mimeType”)
我可以抛出一个错误,如果它存在并且有一个未定义的值。我为什么喜欢这个?因为我喜欢的概念:如果你给我的属性带有未定义的值,我倾向于认为你的代码中有一些bug。定义它与否,我的朋友 我将通过“构造函数”模式来假设,您的意思是分配this.fn=function(){}
和this.val=true构造函数中的代码>
基类.call中的this
被更改为子类,因此其中的所有赋值都是在子类本身上进行的。严格地说,这实际上并没有做任何形式的继承。让我在代码中解释一下
SubClass.prototype = Object.create(BaseClass.prototype);
在这一行中,您将继承子cla上的基类的原型