Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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中正确继承?_Javascript_Oop_Inheritance_Prototypal Inheritance - Fatal编程技术网

如何在javascript中正确继承?

如何在javascript中正确继承?,javascript,oop,inheritance,prototypal-inheritance,Javascript,Oop,Inheritance,Prototypal Inheritance,我的理解是,如果对象有一个给定的成员而没有检查原型链,“hasOwnProperty”返回true。但当我从另一个对象继承时,我会看到最后一个对象本身中的所有成员 考虑以下示例: var Object1 = function (param) { this.prop1 = "p1 " + param; this.prop2 = "p2 " + param; }; var Object2 = function (param) { Object1.apply(this, ar

我的理解是,如果对象有一个给定的成员而没有检查原型链,“hasOwnProperty”返回true。但当我从另一个对象继承时,我会看到最后一个对象本身中的所有成员

考虑以下示例:

var Object1 = function (param) {
    this.prop1 = "p1 " + param;
    this.prop2 = "p2 " + param;
};

var Object2 = function (param) {
    Object1.apply(this, arguments);
    this.prop3 = 'p3' + param;
};

Object2.prototype = new Object1();

var b = new Object2('this is Object 2');

for (var v in b)
    print(v + ": " + b[v] + (b.hasOwnProperty(v)?' (own)':' (inherited)'));
此代码打印:

--prop1: p1 this is Object 2 (own)
--prop2: p2 this is Object 2 (own)
--prop3: p3this is Object 2 (own)
如果我查看调试器,我会看到:

b
  Object2
    prop1: "p1 this is Object 2"
    prop2: "p2 this is Object 2"
    prop3: "p3this is Object 2"
    __proto__: Object1
但是,id I删除了
apply
行,所有这些都更有意义,但基本对象未初始化:

--prop3: p3this is Object 2 (own)
--prop1: p1 undefined (inherited)
--prop2: p2 undefined (inherited)
现在我在调试器中看到:

b
  Object2
    prop3: "p3this is Object 2"
    __proto__: Object1
      prop1: "p1 undefined"
      prop2: "p2 undefined"
      __proto__: Object
据我所知,
apply
就像。。。执行超级类构造函数,以便正确初始化超级成员,但显然这会更改子对象的形状

为什么会这样?在JS中,什么是正确的继承方式,或者至少是不那么混乱的继承方式

我正在看一些关于它的信息,显然每个开发人员对如何做都有不同的感觉

注意。

与执行超类构造函数完全不同。作为构造,它执行第一个提供的参数范围内的任何函数。当您将
传递给您的
Object1
函数(作为函数而不是构造函数执行)时,您正在传递执行第二个函数(
Object2
)的作用域

若要查看发生了什么,请尝试在不执行新代码的情况下执行
Object1(“param”)

Object1("test");
当我们执行
newobject1(“test”)
时,我们得到一个如下所示的对象:

Object { prop1="p1 test", prop2="p2 test"}
但是当我们执行
Object1(“test”)
时,我们返回
未定义的
。。。在与
this
相等的对象上(对于浏览器JavaScript,很可能是
窗口
),我们发现了两个新变量<代码>prop1
prop2

怎么搞的? 这里的关键是:

Object1("param") !== new Object1("param");
第一个版本(
Object1(“param”)
)在一些已经存在的作用域(在浏览器JavaScript中,最常见的作用域是顶级作用域,其中
this===window
)中执行函数(
Object1
),这是调用
Object1.apply(this)
时调用
Object1的方式

第二个版本(
newobject1(“param”)
)作为构造函数执行一个函数,也就是说,它创建一个新的对象,并将
这个
设置为该新对象。如果我们使用相同的
apply
函数来演示这一点,我们将编写
Object1.apply({})


关于如何在JavaScript环境中正确进行类似OOP的编程这一主题,我见过最权威的答案之一,请参见。

可能重复@John Hartsock,实际上不是,这个“问题”也发生在该线程的示例上。感谢您的解释。