Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
objective-c对象可以用作Javascript对象的原型吗?_Javascript_Ios_Prototype_Javascriptcore - Fatal编程技术网

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

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

让我们假设在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是否已损坏,或者我是否遗漏了一些关于其实现方式的关键信息?

是的,它可以。答案来自
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
    

    我可以同意。我想我只能假设在我使用的工具箱中发生了一些奇怪的事情。