这个问题刚刚被投票通过,所以我可以用更新问题
我通过迭代window对象(或用户指定的对象根)来解决这个问题,当我找到正确的实例时,我会回溯并从索引中获得名称。最后的解决办法可以在这里找到。
https://github.com/AndersMalmgren/Knockout.BindingConventions
更新端
我计划为KnockoutJS / MVC编写一个关于配置模板源代码引擎的约定。我从一个小小的客户端POC开始,并立刻遇到了一个停止表演的人。
我的计划是使用这种语法或类似的方法。
MyApp.EditCustomersViewModel = function() {
ko.templates.loadView(this);
};执行此操作时,它将检查篡改板缓存或使用对象名作为密钥从服务器获取模板。问题是我无法获得原型对象的名称,我尝试了以下方法
Object.prototype.getName = function() {
var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec((this).constructor.toString());
return (results && results.length > 1) ? results[1] : "";
};如果适用于定义如下的对象
function MyClass() {
}如果您向上面的对象添加了一个原型,它将不能工作,或者如果您像这样定义它
MyApp = {};
MyApp.MyClass = function() {
};原型和范围界定是两个必须的,所以这是一个展示,有什么想法吗?
小提琴:http://jsfiddle.net/aRWLA/
编辑:背景是这样的。
在服务器上有这样的结构
在客户端你会做的
MyApp.EditCustomersViewModel = function() {
ko.templates.loadView(this);
};,它将生成一个以对象名为键的ajax请求,该请求将获取有关视图的所有模板。
发布于 2012-08-24 08:55:39
只有悬挂函数(function someFunc() {)具有可检索的名称。
分配的函数不会,因为技术上不是命名函数,而是创建匿名函数并将其引用(在内存中)分配给命名变量。
因此,命名的是var,而不是函数。
这使得检索函数名的想法几乎是一个零开始,因为在任何模糊成熟的模式中,您将编写方法,而不是挂起的函数-当然,方法是指定的函数。
命名表达式(见其他答案)是部分解决办法,但它们还有其他问题--尤其是在旧的IEs中缺乏支持。
(Sidenote:我很久以来一直期望浏览器供应商在此基础上进行构建,这样就可以检索指定函数的名称,但还没有joy。)
发布于 2012-08-23 11:15:12
我认为您在错误替换函数原型时存在问题:如果替换函数原型对象,则必须在prototype中保留constructor成员:
function Test1() {
}
Test1.prototype={
constructor: Test1
};
MyApp={};
MyApp.MyClass=function MyClass(){
};
MyApp.MyClass.prototype={
constructor: MyApp.MyClass
};你的例子:http://jsfiddle.net/aRWLA/1/
修改示例:http://jsfiddle.net/aRWLA/2/
发布于 2012-08-23 10:54:10
您可以使用命名函数表达式。
MyApp.MyClass = function MyClass() { ... };但是请注意,它们并不能在IE的所有版本中正确工作。
请参阅:http://kangax.github.com/nfe/
https://stackoverflow.com/questions/12089823
复制相似问题