Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 Function.prototype_Javascript_Prototype Programming - Fatal编程技术网

试图理解javascript Function.prototype

试图理解javascript Function.prototype,javascript,prototype-programming,Javascript,Prototype Programming,我正在努力理解这段代码 Function.prototype.method = function (name, fn) { this.prototype[name] = fn; return this; }; 函数体中的“this”指的是什么? 它是指功能。原型? 它是否正在尝试向中添加成员 Function.prototype.prototype,即Function.prototype.prototype[name]?函数在Function.prototype实例中调用。 因

我正在努力理解这段代码

Function.prototype.method = function (name, fn) {
    this.prototype[name] = fn;
    return this;
};
函数体中的“this”指的是什么? 它是指
功能。原型
?
它是否正在尝试向中添加成员

Function.prototype.prototype
,即
Function.prototype.prototype[name]

函数在
Function.prototype
实例中调用。
因此,
引用了您调用它的函数

this.prototype
将引用调用它的函数的原型

例如:

function MyClass() { }
MyClass.method("myMethod", function() { });

var c = new MyClass();
c.myMethod();    //MyClass.prototype.myMethod
“this”是指您在赋值语句右侧创建的新函数

>     Function.prototype.method = function (name, fn) {
>         this.prototype[name] = fn;
>         return this;
>     };
这意味着函数从Function.prototype继承方法属性。e、 g

当被称为
Foo.method()
时,在method函数中,
将引用Foo,因此:

创建Foo.prototype的sayHi属性,并为其指定所提供函数的值。请注意,Foo不会继承由方法指定的函数,只有由Foo创建的对象(即Foo的实例)才具有该方法

笔记 函数的
关键字由调用设置,因此,如果以其他方式调用方法,它可能会出现错误行为:

  var c = { method: Foo.method };
  alert(typeof c.method); // function

  c.method('sayHi', function(){alert('hi');}); // this.prototype is undefined
函数对象与函数实例对象

首先,在javascript中,函数也是对象。因此,我指的不是new()构造创建的对象,而是函数本身。为了避免混淆,我将这些对象称为函数对象,并将使用函数的new()构造创建的对象称为函数实例对象

_uu原型和原型属性

javascript中的任何函数对象都有两个属性:\ proto\和prototype。此外,任何函数实例对象(使用新构造函数创建)都有一个属性proto。proto是定义继承的东西。关于这方面的一些好的资源可以在

继承是如何定义的

如果objA和objC通过任意数量的u-proto j连接,则对象objA继承另一个对象objC。因此,如果objA的uproto uuu等于objB,而objB的proto uuu等于objC,那么objA继承objB和objC,而objB继承objC

什么是继承

这意味着任何继承对象都可以使用继承对象的任何属性

什么是Function.prototype

它是每个函数对象的“proto”所引用的对象。这意味着每个函数对象都可以访问Function.prototype的属性,因为每个函数对象都继承Function.prototype对象。这也意味着,如果将method属性添加到Function.prototype对象中,javascript中所有可能的函数对象都可以使用它。这包括字符串、数字等

this.prototype[name]=func

当从函数对象(如数字、字符串等)调用“方法”时,“this”指的是函数对象。这意味着我们现在在函数对象中有一个名为“name”的新属性,它是一个函数“func”

函数对象的原型属性有什么好处

函数对象的原型由使用该函数的新构造创建的函数实例对象的uproto uuu引用

如果执行了以下操作:

方法('integer',函数(){…})


然后Number.prototype中定义了整数方法。这意味着每个数字函数实例对象,例如新的数字(2.4),将从Number.prototype“继承”这个新属性“integer”,因为该数字函数实例对象将其“proto”设置为Number.prototype。

+1另外,为了给这个答案添加一点,
返回这个的结尾只是让函数可以链接,例如
MyClass.method(“a”,function(){}).method(“b”,function(){})等等。链接或尾部调用并不总是一个好主意,因为它会使代码难以阅读和调试。那么,为什么这个.prototype未定义(在注释中给出的最后一行代码中)?我理解,即使对于使用literal创建的对象,原型也是object.prototype。所以这里,这个.prototype应该指的是Object.prototype。但很明显,我明白你的观点,“this”的值取决于调用方。你能告诉我我的思路是否正确吗?分配给c的对象是一个没有公共原型属性的普通对象(它只有一个公共属性,方法)。当被称为
c.method()
时,它引用c,但c没有公共原型属性,因此在方法
中,this.prototype
返回未定义。对于函数对象的默认公共原型和用于继承的所有对象(包括函数、数组、日期等)的私有内部
[[prototype]]]
,通常会产生混淆。
  Foo.method('sayHi', function(){alert('hi');});
  var c = { method: Foo.method };
  alert(typeof c.method); // function

  c.method('sayHi', function(){alert('hi');}); // this.prototype is undefined