我是JS的新手,遇到了以下问题:
为什么这不起作用/这段代码在做什么?
var Test = {};
Test.prop = "test property";
Test.Class1 = function () {
}
Test.Class1.prototype = {
m1: function() {
console.log(this.prop);
}
}
Test.Class1.m1();
我对这段代码的理解是:
答案 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.Class1
,prop
应属于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());