Objective-c对象可以用作Javascript对象的原型吗?

时间:2015-10-07 16:23:34

标签: javascript ios prototype javascriptcore

我们假设在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

由于最后两次测试意味着有原型,为什么第二次和第三次测试说没有原型? JavascriptCore是否已损坏,或者我错过了一些关于它如何实现的批评?

1 个答案:

答案 0 :(得分:1)

是的,它可以。答案来自JSExport documentation

  

在JavaScript中,通过一系列原型支持继承   对象。对于您导出的每个Objective-C类,JavaScriptCore都会创建   封闭的JavaScript上下文中的原型(JSContext   宾语)。对于NSObject类,原型对象是   JavaScript上下文的Object原型。对于所有其他Objective-C   类,JavaScriptCore创建一个内部的原型对象   [Prototype]属性指向为其创建的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
  3. 我还运行了一个测试,其中我注释了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
    
相关问题