【问题标题】:Can an objective-c object be used as a prototype of Javascript object?可以将objective-c 对象用作Javascript 对象的原型吗?
【发布时间】:2015-10-07 16:23:33
【问题描述】:

假设在 iOS 中:

@implementation SomeClass
- (void)sayHello {
    NSLog(@"Hello, World!");
}
@end

...

context[@"NativeObject"] = [SomeClass new];

然后在Javascript中:

var test = {};
test.__proto__ = NativeObject;

为什么我检查的时候会这样:

!!NativeObject; //returns true
test.__proto__ === NativeObject; //returns false
test.__proto__ === undefined; //returns true
"sayHello" in test; //returns true
Object.getOwnPropertyNames(test).indexOf("sayHello") == -1; //returns true

既然最后 2 次测试表明有原型,为什么第 2 次和第 3 次测试说没有原型? JavascriptCore 是否损坏了,还是我遗漏了一些关于其实现方式的关键信息?

【问题讨论】:

    标签: javascript ios prototype javascriptcore


    【解决方案1】:

    是的,可以。答案来自JSExportdocumentation

    在 JavaScript 中,通过原型链支持继承 对象。对于您导出的每个 Objective-C 类,JavaScriptCore 创建 封闭 JavaScript 上下文中的原型(一个 JSContext 目的)。对于 NSObject 类,原型对象是 JavaScript 上下文的对象原型。对于所有其他 Objective-C 类,JavaScriptCore 创建一个原型对象,其内部 [Prototype] 属性指向为 Objective-C 类的超类。因此,原型链 JavaScript 包装对象反映了被包装的 Objective-C 类型的 继承层次结构。

    除了原型对象,JavaScriptCore 还产生一个 每个 Objective-C 类的 JavaScript 构造函数对象。

    我放了一个 OS X test project on github 来演示这一点,它会产生以下输出:

    !!NativeObject EQUALS true
    test.__proto__ === NativeObject EQUALS true
    test.__proto__ === undefined EQUALS false
    "sayHello" in test EQUALS true
    Object.getOwnPropertyNames(test).indexOf("sayHello") == -1 EQUALS true
    

    一些观察:

    1. test.__proto__ === NativeObject 总是返回 true 而你看到它返回 false
    2. test.__proto__ === undefined 总是返回 false 而你看到它返回 true

    我还运行了一个测试,其中我注释掉了 JSExport 协议,该协议具有从原型链中删除 SomeClass 的效果,但原型链仍然存在,基于我认为是 NSObject 原型的文档:

    !!NativeObject EQUALS true
    test.__proto__ === NativeObject EQUALS true
    test.__proto__ === undefined EQUALS false
    "sayHello" in test EQUALS false
    Object.getOwnPropertyNames(test).indexOf("sayHello") == -1 EQUALS true
    

    【讨论】:

    • 我可以接受。我想我只能假设我正在使用的工具包中发生了一些奇怪的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多