我试图理解这段代码
Function.prototype.method = function (name, fn) {
this.prototype[name] = fn;
return this;
};
函数体中“this”指的是什么?
它是指Function.prototype
吗?
是否正在尝试添加成员
Function.prototype.prototype
,即Function.prototype.prototype[name]
?
答案 0 :(得分:9)
在Function.prototype
个实例上调用Function
中的函数
因此,this
指的是您调用它的函数。
this.prototype
将引用您调用它的函数的原型。
例如:
function MyClass() { }
MyClass.method("myMethod", function() { });
var c = new MyClass();
c.myMethod(); //MyClass.prototype.myMethod
答案 1 :(得分:2)
“this”指的是您在赋值语句右侧创建的新函数。
答案 2 :(得分:2)
> Function.prototype.method = function (name, fn) {
> this.prototype[name] = fn;
> return this;
> };
这意味着函数从 Function.prototype 继承方法属性。 e.g。
function Foo(){}
alert(typeof Foo.method); // function
当被称为Foo.method()
时,在方法函数中,this
将引用 Foo ,因此:
Foo.method('sayHi', function(){alert('hi');});
创建 Foo.prototype 的 sayHi 属性,并为其指定所提供函数的值。请注意, Foo 不会继承方法分配的功能,只会继承 Foo 创建的对象(即 Foo 的实例>)有方法。
函数的this
关键字是由调用设置的,因此如果您以其他方式调用方法,则可能会出现行为异常:
var c = { method: Foo.method };
alert(typeof c.method); // function
c.method('sayHi', function(){alert('hi');}); // this.prototype is undefined
答案 3 :(得分:0)
功能对象与功能实例对象
首先,在javascript中,函数也是一个对象。从这里,我的意思不是new()构造创建的对象,而是函数本身。为了避免混淆,我将这些对象称为 Function object ,并将使用new()构造函数创建的对象称为 Function instance object 。
_ proto _和原型属性
javascript中的任何函数对象都有两个属性: _ proto _ 和 prototype 。此外,任何 Function实例对象(使用新构造函数创建)都具有属性 _ proto _ 。 _ proto _ 是定义继承的原因。
可以找到一些好的资源http://zeekat.nl/articles/constructors-considered-mildly-confusing.html
如何定义继承?
如果objA和objC通过任意数量的 _ proto _ 连接,则对象objA继承另一个对象objC。因此,如果objA的 _ proto _ 等于objB,并且objB的 _ proto _ 等于objC,则objA继承objB和objC,而objB继承objC。
继承是什么意思?
这意味着任何继承对象都可以使用继承对象的任何属性。
什么是Function.prototype
每个功能对象的 _ proto _ 所引用的对象。这意味着每个 Function对象都可以访问Function.prototype的属性,因为每个 Function对象都继承了Function.prototype对象。这也意味着如果将方法属性添加到Function.prototype对象,它将可用于javascript中所有可能的 Function对象。这包括字符串,数字等
this.prototype [name] = func; 的
'this'指的是函数对象当从函数对象调用'method'时,如Number,String等。这意味着我们现在有一个新的函数对象中的属性,名称为“name”,其函数为“func”。
函数对象的原型由函数实例对象的 _ proto _ 引用使用该函数的新构造创建。功能对象的原型属性有什么用处
如果执行以下操作:
Number.method('integer',function(){...});
然后Number.prototype中定义了整数方法。这意味着每个Number 函数实例对象,例如new Number(2.4),将从Number.prototype“继承”这个新属性'integer',因为Number 函数实例对象将其 _ proto _ 设置为Number .prototype。