我在这里有此功能,我需要在另一个文件中使用名为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;
};
}
答案 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
中定义一个新的函数对象。这不是您想要的,只是不必要的开销。