objective-c对象可以用作Javascript对象的原型吗?
让我们假设在iOS中:objective-c对象可以用作Javascript对象的原型吗?,javascript,ios,prototype,javascriptcore,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 te
@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是否已损坏,或者我是否遗漏了一些关于其实现方式的关键信息?是的,它可以。答案来自
JSExport
:
在JavaScript中,通过原型链支持继承
物体。对于导出的每个Objective-C类,JavaScriptCore都会创建
封装JavaScript上下文(JSContext)中的原型
对象)。对于NSObject类,原型对象是
JavaScript上下文的对象原型。对于所有其他目标-C
类,JavaScriptCore创建一个原型对象,其内部
[Prototype]属性指向为对象创建的Prototype属性
Objective-C类的超类。因此,原型链
JavaScript包装器对象反映了包装的Objective-C类型的
继承层次结构
除了prototype对象之外,JavaScriptCore还生成
每个Objective-C类的JavaScript构造函数对象
我放置了一个示例来演示这一点,它生成以下输出:
!!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.\uuuu proto\uuuu==NativeObject
始终返回true
,而您看到它返回false
test.\uuuu proto\uuuu==未定义
始终返回false
,而您看到它返回true
李>
我还运行了一个测试,在该测试中,我注释掉了JSExport协议,该协议具有从原型链中删除某个类的效果,但原型链仍然存在,基于我假设是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
我可以同意。我想我只能假设在我使用的工具箱中发生了一些奇怪的事情。