你可以初始化一个函数吗? -Javascript

时间:2019-09-08 01:18:30

标签: javascript initialization instance

我在这里有此功能,我需要在另一个文件中使用名为OrderRepository的其他功能。

main.js

function main() {

var orderRepo = new OrderRepository();

// Your code here

}

orderrepository.js

function OrderRepository() {

}

OrderRepository.prototype.getYesterdaysOrders = function 
  getYesterdaysOrders() {
  var yesterdaysOrders = [{ array of objects }],

 return yesterdaysOrders;
};

这些是作为示例使用,将1个问题分为2部分:

1)var orderRepo = new OrderRepository();

您可以初始化这样的函数吗?

2)在 orderrepository.js 中:

function OrderRepository() {

}

main.js 中被调用,但其中没有任何内容,这是赋值形式的原样,这只是一个错字,实际上他们的意思是将所有内容都扔进该函数中,或者我错过了什么吗?

看起来不是吗?

期望

function OrderRepository() {

OrderRepository.prototype.getYesterdaysOrders = function 

  getYesterdaysOrders() {

  var yesterdaysOrders = [{ array of objects }],

  return yesterdaysOrders;

 };
}

2 个答案:

答案 0 :(得分:1)

关于第一部分,看起来该分配正在处理如何在JavaScript中创建对象的实例,这是new运算符的作用。

您可以找到有关new on the MDN的更多信息。

关于第二个问题,它正在处理如何创建继承方法的对象。因此,是的,它是空的,直到您到达prototype表达式为止。

在这种情况下,预期代码不会为您提供继承。注意如何在函数内重复OrderRepository,这将是无效的。 Javascript要求您将继承添加到特殊的prototype属性中。仅在这种情况下,添加到function声明中的代码才能在function范围内使用。

您可以找到有关prototype on the MDN的更多信息。

答案 1 :(得分:1)

深入研究JavaScript,很难理解该语言。 JavaScript并不是真正的OOP(imho),至少它没有实现通用的OOP概念。有人称其为基于对象的语言。没有课程。最近的ECMA脚本标准确实实现了class关键字,但是它是语法糖。与new关键字一起使用时,它可以构建与“构造函数”可以实现的对象相同的对象。

JavaScript中的所有内容都是对象,甚至是数字和函数。每个函数都可以充当构造函数。 new关键字使用新创建的空对象作为函数的this上下文调用构造函数。该功能可以执行其所需的操作。如果不返回任何内容,则this表达式将返回其new上下文。

因为没有类,所以没有继承。原型概念可以实现一些类似继承的行为。在大多数情况下,构造函数将不返回任何内容,有时会通过添加属性来修改this对象。方法是保存函数对象的属性。构造函数调用的new上下文中的对象将具有原型对象引用作为__proto__属性。这是由new运算符从被调用的构造函数的prototype属性中复制的。默认值为空对象。

// empty constructor function
function OrderRepository() {

}

// define a function property on the constructor's prototype object
OrderRepository.prototype.getYesterdaysOrders = function 
  getYesterdaysOrders() {
  var yesterdaysOrders = [ /* array of objects */ ],

 return yesterdaysOrders;
};

// create an empty object with a `__proto__` property holding a
// reference to the object { getYesterdaysOrders: function(){/*code*/} }
var obj = new OrderRepository();

现在,当尝试方法调用obj.getYesterdaysOrders()时,JavaScript将查看obj中是否定义了这样的属性。如果不是,则检查obj.__proto__中是否存在引用,并在obj.__proto__的属性中搜索属性名称。如果没有,则重复相同的步骤,直到找到它或链中的__proto__属性为null。由于定义了obj.__proto__.getYesterdaysOrders,因此将检查它是否是可调用的函数对象,并由于我们调用了this,因此最终使用obj的{​​{1}}上下文进行了调用。否则会引发错误。

注意:即使主要的浏览器确实公开了obj.getYesterdaysOrders()属性,它也不是标准的一部分。不要直接使用它(开发时进行调试除外),更重要的是:不要操纵它。如果确实需要在构造后获取或操作对象实例的原型(__proto__),请使用内置__proto__对象的方法。

在您上一次编辑时:您期望的代码将在每个实例化(并因此构造函数调用)的Object中定义一个新的函数对象。这不是您想要的,只是不必要的开销。