为什么直接在函数上添加方法没有像 function.prototype 那样工作?

Why adding a method on function directly did not work like function.prototype?

我正在学习并试图深入理解 JavaScript 对象。我通过下面的示例学习了 Object prototype

var MyObj = function(){
   this.Name = "Whosebug";
}

MyObj.prototype.prop = "OK"; 

var instance = new MyObj();
instance.prop = "OK";

console.log(instance.hasOwnProperty("Name")); //true
console.log(Object.getOwnPropertyNames(instance)); //[ 'Name', 'prop' ]

在上面的示例中,instance 对象无法访问 ObjectgetOwnPropertyNames。因为 getOwnPropertyNames 函数不是 Object 的原型成员。在此之后,当我像上面的 Object 一样编写自己的对象时,例如

var MyDream = function(){}
MyDream.prototype.canAccessThisMethod = function(x){};

var instanceSample = new MyDream();

instanceSample.canAccessThisMethod("blabla"); //because of prototype
MyDream.method(blabla); // didn't work.

如何使 MyDream.method 在此示例中起作用?

您可以这样做,例如:

instanceSample.prototype.method = function( x ){
...
}

原型意味着方法"method"将被添加到class"MyDream"

的所有对象

除了解释 prototypes,让我们重点关注您在以下代码片段中提出的问题,即

var MyDream = function(){}
MyDream.prototype.canAccessThisMethod = function(x){ };

var instanceSample = new MyDream();

instanceSample.canAccessThisMethod("blabla"); //because of prototype
MyDream.method(blabla); //How can we write "MyDream.method" in this example

让我们一步步来。

var MyDream = function(){}

您创建了一个匿名函数并将其分配给 MyDream 变量。 Functions are first class objects in JavaScript。它们功能强大且灵活。因此,作为第一个 class 对象,您可以像以前一样将它们分配给变量。您可以将它们作为参数传递。除此之外,您还可以将原型链扩展为

MyDream.prototype.canAccessThisMethod = function(x){ };

我相信您已经弄清楚了其余的内容,因此跳过细节并快进到此声明。

MyDream.method(blabla);

不幸的是,这行不通。原因是,要添加 function as method 您需要将其分配为函数文字。您可以像 Objects.

添加方法来发挥作用
MyDream.method = function(x) {
    console.log(x);
}

MyDream.method("bla bla");