调用对象原型的方法

时间:2017-02-17 20:36:12

标签: javascript oop prototype

我是JS的新手,遇到了以下问题:

为什么这不起作用/这段代码在做什么?

var Test = {};
Test.prop = "test property";

Test.Class1 = function () {
}

Test.Class1.prototype = {
    m1: function() {
        console.log(this.prop);
    }
}

Test.Class1.m1();

我对这段代码的理解是:

  1. 创建名为测试
  2. 的新对象
  3. 将属性 prop 添加到测试
  4. 测试
  5. 中创建名为 Class1 的新对象
  6. 将方法 m1 添加到 Class1
  7. 测试
  8. 中调用 Class1 m1 方法

4 个答案:

答案 0 :(得分:1)

在JavaScript中,即使函数的prototype属性也是一个对象。在创建一个原型是您定义的对象之前,Test1.Class1.prototype只是一个常规对象。基本上它的工作方式与以下代码片段相同:

var Test1 = { prototype { m1: function() {} } };
// You're trying to call an undefined function!
Test.m1();

// This is fine
Test1.prototype.m1();

另一方面,当您使用new运算符时,您将创建一个新对象,其原型是设置为构造函数的对象。这里启动 magic

var Test1 = function() {};
Test1.prototype = {
    doStuff: function() {}
};

var object1 = new Test1();
// This works!
object1.doStuff();

当您访问某个属性时,JavaScript的运行时检查该对象以查明是否有一个名为doStuff的函数,否则它会在该对象的原型上查找它,否则它看起来就是原型的原型等等......

实际上new运算符是syntactic sugar。 ECMA-Script 5引入了Object.create,使一切更加清晰:

var Test1 = {
    doStuff: function() {
    }
};

// The first parameter of Object.create is
// the object that's going to be the prototype of
// Test1 object!
var object1 = Object.create(Test1);
// This works too!
object1.doStuff();

您可能应该查看其他问答:How does JavaScript .prototype work?

答案 1 :(得分:0)

prototype链接仅适用于使用new运算符创建的实例。

否则,您必须显式调用prototype才能访问该方法。

let testClass = new Test.Class1();

testClass.m1();

此外,由于您尝试访问prop属性。

Test.Class1.prototype = {
    m1: function() {
        console.log(this.prop);
    }
}

致电网站为Test.Class1prop应属于Test.Class1而不是Test

答案 2 :(得分:0)

我更改了事物的名称,但这应该有效。

var Person = function(){
    this.message = "Hello, world!";
};

Person.prototype = Object.create(Object.prototype);
Person.prototype.constructor = Person;

Person.prototype.greet = function(){
    console.log(this.message);
    alert(this.message);
}; 

var tom = new Person();
tom.greet();

答案 3 :(得分:0)

您需要先创建原型实例,然后才能使用其方法:

var instance = new Test.Class1();
console.log(instance.m1());

即便如此,Test.prop也不是实例的一部分,并且m1

无法访问

编辑:这是一个有效的例子:

var test = function() {
  this.prop = "A property";
}

test.prototype.m1 = function() {
  console.log(this.prop);
}

var instance = new test();
console.log(instance.m1());