我从经典的OOP背景来看Javascript并且在理解原型方面遇到了麻烦。
给出下面的代码示例:
这可能在第一季回答,但bar1和bar2可以互相呼叫吗?
function foo()
{
this.property = "I'm a property";
this.privileged = function()
{
// do stuff
}
}
foo.prototype.bar = function()
{
// do stuff
}
foo.prototype.bar2 = function()
{
// stuff
}
答案 0 :(得分:4)
到目前为止,有很多关于此事的FUD。
1)。简单用法:
var xxx = new foo(); // Create instance of object.
xxx.privileged(); // Calls the internal closure.
xxx.bar(); // First looks for internals, then looks to the prototype object.
2)。这基本上创建了一个只能在实例上修改的闭包。根本不是私有的(因为任何东西都可以通过对象实例与它交谈),而是函数的单个副本,其中对象的每个实例都获得该函数的新副本。您可以更改函数本身,但不能全局更改它。我不是这种创造方法的忠实粉丝。
3)。是:
foo.prototype.bar = function(){
this.bar2();
}
foo.prototype.bar2 = function(){
this.bar();
}
// Although... NEVER do both. You'll wind up in a circular chain.
为了启发,我为你建立了一个小提琴,它可以帮助显示事物的调用方式: http://jsfiddle.net/7Y5QK/
答案 1 :(得分:2)
1)frist是Clyde Lobo的回答:
var f = new foo();
f.bar();
2)在consturctor
(特权)上编写一个函数,每个实例都会创建一个新函数,如果在prototype
上定义了一个方法,则每个实例共享相同的prototype
方法:
var f1 = new foo(), // instance 1
f2 = new foo(); // instance 2
f1.privileged === f2. privileged // -> false , every instance has different function
f1.bar === f2.bar // -> true, every instance share the some function
3)你可以在bar2
this.bar()`中调用bar' by
,代码如下:
function foo() {
this.property = "I'm a property";
this.privileged = function() {
// do stuff
};
}
foo.prototype.bar = function() { // defined a method bar
alert('bar called');
this.bar2(); // call bar2
};
foo.prototype.bar2 = function() { // defined a method bar2
alert('bar2 called');
};
var f = new foo();
f.bar(); // alert 'bar called' and 'bar2 called'
f.bar2(); // alert 'bar2 called'
答案 2 :(得分:1)
您可以通过this.bar();
执行foo中的bar
但它只有在您使用new foo();
并且具有从foo
继承的对象时才有效。否则,如果您只是致电foo();
,this
将指向全局对象。
基本上相同的是,只有你在函数中赋予继承对象的属性和方法才能访问传递给foo
的任何参数。
是的,他们可以互相打电话,因为功能是“悬挂的”。他们可以访问最近的外部范围内的所有变量和对象,以及它们的功能上下文。
您的代码中确实存在语法错误。在分配原型的地方,您没有创建函数。你的意思是:
foo.prototype.bar = function() { /* ... */ };
答案 3 :(得分:0)
1.您可以创建foo的实例,如
var f = new foo();
然后致电f.bar()
和f.bar2()
点2& David已经解释过3