【问题标题】:Why adding a method on function directly did not work like function.prototype?为什么直接在函数上添加方法不像function.prototype那样工作?
【发布时间】:2016-11-01 01:55:30
【问题描述】:

我正在学习并尝试深入了解 JavaScript 对象。我通过下面的例子学习了Object 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 对象不能访问getOwnPropertyNamesObject。因为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 在这个例子中工作?

【问题讨论】:

  • 欢迎来到 StackOverflow。首先有几件事,你想学习prototypes,这很好,反正在这里给function添加方法没有任何意义。但你会在途中绕过这些事情。

标签: javascript prototype javascript-objects


【解决方案1】:

你可以这样做,例如:

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

原型意味着方法“method”将被添加到类“MyDream”的所有对象中

【讨论】:

    【解决方案2】:

    除了解释prototypes之外,让我们专注于您在以下sn-p中提出的问题,即

    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。它们功能强大且灵活。因此,作为第一类对象,您可以像以前一样将它们分配给变量。您可以将它们作为参数传递。最重要的是,您还可以将原型链扩展为

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

    我相信你已经弄清楚了其余的东西,所以跳过细节并快速前进到这个陈述。

    MyDream.method(blabla);
    

    很遗憾,这行不通。原因是,要添加 function as method 您需要将其分配为函数文字。你可以像Objects一样添加方法来运行。

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

    【讨论】:

    • 嗨 Rohit416。谢谢你的答复。您说“MyDream.method”不起作用。它仅用作文字功能。我明白这里没有问题。我想知道 Object.getOwnPropertyNames 是如何工作的?
    • 是否可以将继承对象中无法访问的方法编写为文字函数
    • “我想知道 Object.getOwnPropertyNames 是如何工作的” 它有不同的用途,它返回对象中存在的所有属性名称和方法。此外,所有内置类型都被视为 Object 的实例。一个function 原型实际上是一个Object,它最终指向function( ){ }
    • “是否有可能编写一个函数,该函数具有从继承对象中无法访问的方法作为文字函数” 从技术上讲,如果您有一个包含少量方法的函数,而不是它的原型链然后可以决定公开哪个方法,但是一旦它们位于该函数的原型链上,那么您就无法从继承的对象中隐藏这些方法。你可以举任何 JS 库的例子,比如AngularjQuery
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2011-05-13
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多