【问题标题】:Is it possible to call constructor function method without creating object in JS?是否可以在不在 JS 中创建对象的情况下调用构造函数方法?
【发布时间】:2017-03-12 09:56:35
【问题描述】:

我不确定对象字面量和构造函数之间的区别。

function user() {
    this.name="john"
    this.getName=function (){
        return this.name;
    };
}

var johnUser=new user();
console.log(johnUser.getName()); // Will console john

如果我想调用getName 而不创建任何类似Java 静态方法/函数的对象怎么办?

如果我可以添加

user.sayName=function() {
    console.log("Hey there");
}

console.log(user.sayName()); //will console Hey there.

如何访问构造函数属性?

【问题讨论】:

  • user.sayName = function... 的第二个块有效。这不是你想要的吗?
  • 看来您正在使用 JavaScript,希望它是用于浏览器的 Java。它不是。您应该花一些时间来了解原型继承模型,这与经典继承有很大不同。他在很多方面都很有判断力,并不把他的话当成福音,但我想你可能会从这些视频中学到很多:youtube.com/watch?v=riDVvXZ_Kb4youtube.com/watch?v=wfMtDGfHWpA
  • 谢谢大家,如果我想通过 johnUser 对象调用 sayName 函数怎么办...可以吗?
  • @john33,这可能会对您有所帮助:stackoverflow.com/q/35156270/1911755

标签: javascript constructor


【解决方案1】:

答案是你不能。 你应该已经阅读了函数上下文在 JS 中是如何工作的。

当您使用 new 运算符时,空对象被作为上下文传递,这就是为什么您可以分配 this 的属性(这是对函数上下文的引用)

当您在没有 new 运算符的情况下调用函数时,您的函数的上下文是全局对象(窗口)或未定义。您可以在函数中打印 this 以查看您拥有 ATM 的上下文。

你(可能)想要的是创建一个prototype

【讨论】:

  • 从“不创建任何类似java静态方法的对象”的陈述来看,我认为他实际上只是在寻找一个具有帮助器等功能的简单对象。 Java 开发人员通常很难接受 JavaScript 缺乏静态特性。
【解决方案2】:

对象字面量

var user = {
    name: "John",
    getName: function(){
        return this.name;
   }
};

或者,这种方法不会定义对象。

function sayName()
{
    return "just a string";
}

【讨论】:

  • 我认为人们可能会对您投反对票,因为当问题专门询问如何在不创建对象的情况下创建对象时,您正在创建对象,但这是执行 OP 要求的完全合适的方式. getName 是一个可怕的例子,但是因为 OP 说他正在寻找的是 Java 静态方法的等价物,它不会访问实例参数(并且名称听起来像一个实例参数,即使它实际上在这里模仿了一个类级别)。跨度>
  • 他可能在找function sayName() { return "just a string literal"; }
【解决方案3】:
function user() {
    this.name = 'john';
}

user.prototype.getName = function(){ return this.name; }

var johnUser = new user();

console.log( johnUser.getName() )       // john
console.log( user.prototype.getName()); // undefined

user.prototype.getName = function(){ return 'just a string' }

console.log( johnUser.getName() )      // just a string
console.log( user.prototype.getName());// just a string

user.prototype.getName = function(){ return this.name || 'just a string'; }

console.log( johnUser.getName() )      // john
console.log( user.prototype.getName());// just a string

【讨论】:

  • 再次谢谢你,但我不想调用原型属性函数,而是我想调用这个函数 user.sayName=function(){ console.log("Hey there"); } 文字通过 johnUser.
  • 伪代码,相似性:function user(){} === user.function(){}; user.sayName=function(){}; /* user { function : (){}, sayName : { function : (){} }} */ 并且在调用user()(或new user())时执行了一些类似user.function(),而sayName不在function
猜你喜欢
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多