javascript - 为什么直接在 function 上添加方法不能像 function.prototype 那样工作?

标签 javascript prototype javascript-objects

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

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

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 的原型(prototype)成员。在此之后,当我编写自己的对象时,例如上面的 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 在此示例中起作用?

最佳答案

除了解释原型(prototype)之外,让我们关注您在以下代码片段中提出的问题,即

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 .它们功能强大且灵活。因此,作为一流的对象,您可以像以前一样将它们分配给变量。您可以将它们作为参数传递。除此之外,您还可以将原型(prototype)链扩展为

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

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

MyDream.method(blabla);

不幸的是,这行不通。原因是,要添加 function as method您需要将其分配为函数文字。您可以像 Objects 一样添加方法来发挥作用。

MyDream.method = function(x) {
    console.log(x);
}

MyDream.method("bla bla");

关于javascript - 为什么直接在 function 上添加方法不能像 function.prototype 那样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38098220/

相关文章:

javascript - 身份验证 ExpressJS -> PassportJs : Error: Can't set headers after they are sent

javascript - es6 多行模板字符串,没有新行并允许缩进

JavaScript:扩展 Array.prototype 有什么危险?

javascript - 更改原型(prototype)中的值在 JavaScript 中不起作用

javascript - 计算数组中多个对象的属性

JavaScript :Multiple variables returned from a global function isn't able to be accessed by object

javascript - 将项目添加到函数内的对象

javascript - 数据服务和 ionic 问题

javascript - 如何在 Redux 中使用 React Native AsyncStorage?

class - Lua 中的继承是基于原型(prototype)的还是基于类的?