Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当对照父对象属性进行检查时,hasOwnProperty返回true_Javascript_Prototypal Inheritance_Hasownproperty_Coding Efficiency - Fatal编程技术网

Javascript 当对照父对象属性进行检查时,hasOwnProperty返回true

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

我的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_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
as
false
处理未定义的情况,无论它是否存在,都执行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上的
基类的原型