我们假设在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是否已损坏,或者我错过了一些关于它如何实现的批评?
答案 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
一些观察结果:
test.__proto__ === NativeObject
始终返回true
,而您看到它返回false
。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