首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取原型对象的名称

获取原型对象的名称
EN

Stack Overflow用户
提问于 2012-08-23 10:41:43
回答 4查看 5.7K关注 0票数 7

这个问题刚刚被投票通过,所以我可以用更新问题

我通过迭代window对象(或用户指定的对象根)来解决这个问题,当我找到正确的实例时,我会回溯并从索引中获得名称。最后的解决办法可以在这里找到。

https://github.com/AndersMalmgren/Knockout.BindingConventions

更新端

我计划为KnockoutJS / MVC编写一个关于配置模板源代码引擎的约定。我从一个小小的客户端POC开始,并立刻遇到了一个停止表演的人。

我的计划是使用这种语法或类似的方法。

代码语言:javascript
复制
MyApp.EditCustomersViewModel = function() {
   ko.templates.loadView(this);
};

执行此操作时,它将检查篡改板缓存或使用对象名作为密钥从服务器获取模板。问题是我无法获得原型对象的名称,我尝试了以下方法

代码语言:javascript
复制
Object.prototype.getName = function() {
   var funcNameRegex = /function (.{1,})\(/;
   var results = (funcNameRegex).exec((this).constructor.toString());
   return (results && results.length > 1) ? results[1] : "";
};

如果适用于定义如下的对象

代码语言:javascript
复制
function MyClass() { 
}

如果您向上面的对象添加了一个原型,它将不能工作,或者如果您像这样定义它

代码语言:javascript
复制
MyApp = {};
MyApp.MyClass = function() {
};

原型和范围界定是两个必须的,所以这是一个展示,有什么想法吗?

小提琴:http://jsfiddle.net/aRWLA/

编辑:背景是这样的。

在服务器上有这样的结构

  • 模板\ ViewName\index.html
  • 模板\ViewName\sub template.html

在客户端你会做的

代码语言:javascript
复制
MyApp.EditCustomersViewModel = function() {
   ko.templates.loadView(this);
};

,它将生成一个以对象名为键的ajax请求,该请求将获取有关视图的所有模板。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-24 08:55:39

只有悬挂函数(function someFunc() {)具有可检索的名称。

分配的函数不会,因为技术上不是命名函数,而是创建匿名函数并将其引用(在内存中)分配给命名变量。

因此,命名的是var,而不是函数。

这使得检索函数名的想法几乎是一个零开始,因为在任何模糊成熟的模式中,您将编写方法,而不是挂起的函数-当然,方法是指定的函数。

命名表达式(见其他答案)是部分解决办法,但它们还有其他问题--尤其是在旧的IEs中缺乏支持。

(Sidenote:我很久以来一直期望浏览器供应商在此基础上进行构建,这样就可以检索指定函数的名称,但还没有joy。)

票数 4
EN

Stack Overflow用户

发布于 2012-08-23 11:15:12

我认为您在错误替换函数原型时存在问题:如果替换函数原型对象,则必须在prototype中保留constructor成员:

代码语言:javascript
复制
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/

票数 2
EN

Stack Overflow用户

发布于 2012-08-23 10:54:10

您可以使用命名函数表达式

代码语言:javascript
复制
MyApp.MyClass = function MyClass() { ... };

但是请注意,它们并不能在IE的所有版本中正确工作。

请参阅:http://kangax.github.com/nfe/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12089823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档