Áù¡¢ JSExport
JSExportÐÒéÌṩÁËÒ»ÖÖÉùÃ÷ʽµÄ·½·¨È¥ÏòJavaScript´úÂëµ¼³öObjective-CµÄʵÀýÀ༰ÆäʵÀý·½·¨£¬Àà·½·¨ºÍÊôÐÔ¡£
1. ÔÚJavaScriptÖе÷ÓÃnative´úÂë
Á½ÖÖ·½Ê½£º
1,.Block
2.JSExport
BlockµÄ·½Ê½ºÜ¼òµ¥£¬ÈçÏ£º
context[@"add"] = ^(NSInteger a,
NSInteger b) { return a+b; };
JSValue *resultValue = [context
evaluateScript:@"add(5, 6)"];
//ÁíÍâÒ»ÖÖµ÷ÓÃJSº¯ÊýµÄ·½·¨
resultValue = [context[@"add"]
callWithArguments:@[@(5), @(6)]];
NSLog(@"resultValue = %@", resultValue); |
Output£º
JSExportµÄ·½Ê½ÐèҪͨ¹ý¼Ì³ÐJSExportÐÒéµÄ·½Ê½À´µ¼³öÖ¸¶¨µÄ·½·¨ºÍÊôÐÔ£º
@class MyPoint;
@protocol MyPointExports
<JSExport>
@property double x;
@property double y;
- (NSString *)description;
- (instancetype)initWithX:(double
)x y:(double)y;
+ (MyPoint *)makePointWithX:
(double)x y:(double)y;
@end
@interface MyPoint : NSObject
<MyPointExports>
- (void)myPrivateMethod; // Not
in the MyPointExports protocol, so
not visible to JavaScript code.
+ (void)test;
@endltValue);
|
¼Ì³ÐÓÚJSExportÐÒéµÄMyPointExportsÐÒéÖеÄʵÀý±äÁ¿£¬ÊµÀý·½·¨ºÍÀà·½·¨¶¼»á±»µ¼³ö£¬¶øMyPointÀàµÄ-
(void)myPrivateMethod·½·¨È´²»»á±»µ¼³ö¡£
ÔÚOC´úÂëÖÐÎÒÃÇÕâÑùµ¼³ö£º
//µ¼³ö¶ÔÏó context[@"point"] = [[MyPoint alloc]
initWithX:6 y:8];
//µ¼³öÀà
context[@"MyPoint"] = [MyPoint class]; |
ÔÚJS´úÂëÖпÉÒÔÕâÑùµ÷Óãº
// Objective-C properties become
fields. point.x;
point.x = 10;
// Objective-C instance methods
become functions.
point.description();
// Objective-C initializers can be
called with constructor syntax.
var p = MyPoint(1, 2);
// Objective-C class methods become
functions on the constructor object.
var q = MyPoint.makePointWithXY(0, 0); |
2. µ¼³öOC·½·¨ºÍÊôÐÔ¸øJS
1.ĬÈÏÇé¿öÏ£¬Ò»¸öObjective-CÀàµÄ·½·¨ºÍÊôÐÔÊDz»»áµ¼³ö¸øJavaScriptµÄ¡£Äã±ØÐëÑ¡ÔñÖ¸¶¨µÄ·½·¨ºÍÊôÐÔÀ´µ¼³ö¡£¶ÔÓÚÒ»¸öclassʵÏÖµÄÿ¸öÐÒ飬Èç¹ûÕâ¸öÐÒé¼Ì³ÐÁËJSExportÐÒ飬JavaScriptCore¾Í½«Õâ¸öÐÒéµÄ·½·¨ºÍÊôÐÔÁÐ±íµ¼³ö¸øJavaScript¡£
2.¶ÔÓÚÿһ¸öµ¼³öµÄʵÀý·½·¨£¬JavaScriptCore¶¼»áÔÚprototypeÖд´½¨Ò»¸ö´æÈ¡Æ÷ÊôÐÔ¡£¶ÔÓÚÿһ¸öµ¼³öµÄÀà·½·¨£¬JavaScriptCore»áÔÚconstructor¶ÔÏóÖд´½¨Ò»¸ö¶ÔÓ¦µÄJavaScript
function¡£
3.ÔÚObjective-CÖÐͨ¹ý@propertyÉùÃ÷µÄÊôÐÔ¾ö¶¨ÁËJavaScriptÖеĶÔÓ¦ÊôÐÔµÄÌØÕ÷£º

4.Objective-CÀàÖеÄÊôÐÔ£¬³ÉÔ±±äÁ¿ÒÔ¼°·µ»ØÖµ¶¼½«¸ù¾ÝJSValueÖ¸¶¨µÄ¿½±´ÐÒé½øÐÐת»»¡£
3. º¯ÊýÃûת»»
ת»»³ÉÍÕ·åÐÎʽ£º
1.È¥µôËùÓеÄðºÅ
2.ËùÓÐðºÅºóµÄµÚÒ»¸öСд×Öĸ¶¼»á±»×ªÎª´óд

4. ×Ô¶¨Òåµ¼³öº¯ÊýÃû
Èç¹û²»Ï²»¶Ä¬ÈϵÄת»»¹æÔò£¬Ò²¿ÉÒÔʹÓÃJSExportAsÀ´×Ô¶¨Òåת»»

5. µ¼³öOC¶ÔÏó¸øJS
1.ÈçºÎµ¼³ö×Ô¶¨ÒåµÄ¶ÔÏó£¿
2.×Ô¶¨Òå¶ÔÏóÓи´Ôӵļ̳йØÏµÊÇÈçºÎµ¼³öµÄ£¿
ÔÚÌÖÂÛÕâ¸ö»°Ìâ֮ǰ£¬ÎÒÃÇÊ×ÏÈÐèÒª¶ÔJavaScriptÖеĶÔÏóÓë¼Ì³Ð¹ØÏµÓÐËùÁ˽⡣
Æß¡¢ JavaScript¶ÔÏó¼Ì³Ð
Èç¹ûÄãÒѾÁ˽âJavaScriptµÄ¶ÔÏó¼Ì³Ð£¬¿ÉÒÔÌø¹ý±¾½Ú¡£
ÕâÀï»á¿ìËÙ½éÉÜJavaScript¶ÔÏó¼Ì³ÐµÄһЩ֪ʶ£º
1. JavaScriptµÄÊý¾ÝÀàÐÍ
×îÐ嵀 ECMAScript ±ê×¼¶¨ÒåÁË 7 ÖÖÊý¾ÝÀàÐÍ£º
6 ÖÖ ÔʼÀàÐÍ:
1.Boolean
2.Null
3.Undefined
4.Number
5.String
6.Symbol (ECMAScript 6 ж¨Òå)ºÍ Object
2. JavaScriptÔʼֵ
³ý Object ÒÔÍâµÄËùÓÐÀàÐͶ¼ÊDz»¿É±äµÄ£¨Öµ±¾ÉíÎÞ·¨±»¸Ä±ä£©¡£ÎÒÃdzÆÕâЩÀàÐ͵ÄֵΪ¡°Ôʼֵ¡±¡£
1.²¼¶ûÀàÐÍ£ºÁ½¸öÖµ£ºtrue ºÍ false
2.Null ÀàÐÍ£ºÖ»ÓÐÒ»¸öÖµ£º null
3.Undefined ÀàÐÍ£ºÒ»¸öûÓб»¸³ÖµµÄ±äÁ¿»áÓиöĬÈÏÖµ undefined
4.Êý×ÖÀàÐÍ
5.×Ö·û´®ÀàÐÍ£º²»Í¬ÓÚÀà C ÓïÑÔ£¬JavaScript ×Ö·û´®ÊDz»¿É¸ü¸ÄµÄ¡£ÕâÒâζ×Å×Ö·û´®Ò»µ©±»´´½¨£¬¾Í²»Äܱ»ÐÞ¸Ä
6.·ûºÅÀàÐÍ
3. JavaScript¶ÔÏó
ÔÚ Javascript À¶ÔÏó¿ÉÒÔ±»¿´×÷ÊÇÒ»×éÊôÐԵļ¯ºÏ¡£ÕâЩÊôÐÔ»¹¿ÉÒÔ±»Ôö¼õ¡£ÊôÐÔµÄÖµ¿ÉÒÔÊÇÈÎÒâÀàÐÍ£¬°üÀ¨¾ßÓи´ÔÓÊý¾Ý½á¹¹µÄ¶ÔÏó¡£
ÒÔÏ´úÂë¹¹ÔìÁËÒ»¸öpoint¶ÔÏó£º
var point = { x : 99, y : 66, revers : function() { var tmp = this.x this.x = this.y this.y = tmp }, name : 'BiuBiuBiu', next : null }
point.revers(); |
4. JavaScriptÊôÐÔ
ECMAScript¶¨ÒåµÄ¶ÔÏóÖÐÓÐÁ½ÖÖÊôÐÔ£ºÊý¾ÝÊôÐԺͷÃÎÊÆ÷ÊôÐÔ¡£
1.Êý¾ÝÊôÐÔ
Êý¾ÝÊôÐÔÊǼüÖµ¶Ô£¬²¢ÇÒÿ¸öÊý¾ÝÊôÐÔÓµÓÐÏÂÁÐÌØÐÔ:

2.·ÃÎÊÆ÷ÊôÐÔ
·ÃÎÊÆ÷ÊôÐÔÓÐÒ»¸ö»òÁ½¸ö·ÃÎÊÆ÷º¯Êý (get ºÍ set) À´´æÈ¡ÊýÖµ£¬²¢ÇÒÓÐÒÔÏÂÌØÐÔ:

5. JavaScriptÊôÐÔÉèÖÃÓë¼ì²â
1.ÉèÖÃÒ»¸ö¶ÔÏóµÄÊôÐÔ»áÖ»»áÐ޸ĻòÐÂÔöÆä×ÔÓÐÊôÐÔ£¬²»»á¸Ä±äÆä¼Ì³ÐµÄͬÃûÊôÐÔ
2.µ÷ÓÃÒ»¸ö¶ÔÏóµÄÊôÐÔ»áÒÀ´Î¼ìË÷±¾Éí¼°Æä¼Ì³ÐµÄÊôÐÔ£¬Ö±µ½¼ì²âµ½
var point = {x:99, y:66}; var childPoint = Object.create(point); console.log(childPoint.x) childPoint.x = 88 console.log(childPoint.x) |
Output:
ÔÚchromeµÄ¿ØÖÆÌ¨ÖУ¬ÎÒÃÇ·Ö±ð´òÓ¡ÉèÖÃxÊôÐÔǰºópoint¶ÔÏóµÄÄÚ²¿½á¹¹£º
ÉèÖÃǰ

ÉèÖúó

¿É¼û£¬ÉèÖÃÒ»¸ö¶ÔÏóµÄÊôÐÔ²¢²»»áÐÞ¸ÄÆä¼Ì³ÐµÄÊôÐÔ£¬Ö»»áÐ޸ĻòÔö¼ÓÆä×ÔÓÐÊôÐÔ¡£
ÕâÀïÎÒÃÇ̸µ½ÁËprotoºÍ¼Ì³ÐÊôÐÔ£¬ÏÂÃæÎÒÃÇÏêϸ½²½â¡£
°Ë¡¢ Prototype
JavaScript¶ÔÓÚÓлùÓÚÀàµÄÓïÑÔ¾ÑéµÄ¿ª·¢ÈËÔ±À´ËµÓеãÁîÈËÀ§»ó (ÈçJava»òC ++) £¬ÒòΪËüÊǶ¯Ì¬µÄ£¬²¢ÇÒ±¾Éí²»ÌṩÀàʵÏÖ¡£(ÔÚES2015/ES6ÖÐÒýÈëÁËclass¹Ø¼ü×Ö£¬µ«ÊÇÖ»ÊÇÓï·¨ÌÇ£¬JavaScript
ÈÔÈ»ÊÇ»ùÓÚÔÐ͵Ä)¡£
µ±Ì¸µ½¼Ì³Ðʱ£¬Javascript Ö»ÓÐÒ»Öֽṹ£º¶ÔÏó¡£Ã¿¸ö¶ÔÏó¶¼ÓÐÒ»¸öÄÚ²¿Á´½Óµ½ÁíÒ»¸ö¶ÔÏ󣬳ÆÎªËüµÄÔÐÍ
prototype¡£¸ÃÔÐͶÔÏóÓÐ×Ô¼ºµÄÔÐÍ£¬µÈµÈ£¬Ö±µ½´ïµ½Ò»¸öÒÔnullΪÔÐ͵ĶÔÏ󡣸ù¾Ý¶¨Ò壬nullûÓÐÔÐÍ£¬²¢ÇÒ×÷ΪÕâ¸öÔÐÍÁ´
prototype chainÖеÄ×îÖÕÁ´½Ó¡£
ÈκÎÒ»¸ö¶ÔÏó¶¼ÓÐÒ»¸öprotoÊôÐÔ£¬ÓÃÀ´±íʾÆä¼Ì³ÐÁËʲôÔÐÍ¡£
ÒÔÏ´úÂ붨һ¸ö¾ßÓм̳йØÏµµÄ¶ÔÏó£¬point¶ÔÏó¼Ì³ÐÁËÒ»¸ö¾ßÓÐx£¬yÊôÐÔµÄÔÐͶÔÏó¡£
var point = { name : null, __proto__ : { x:99, y:66, __proto:Object.prototype } }
Object.prototype.__proto__
== null \\true |
ÔÚChromeµÄ¿ØÖÆÌ¨ÖУ¬ÎÒÃÇ´òÓ¡¶ÔÏó½á¹¹£º

¿É¼û¼Ì³Ð¹ØÏµ£¬point¼Ì³ÐµÄÔÐÍÓּ̳ÐÁËObject.prototype£¬¶øObject.prototypeµÄprotoÖ¸Ïònull£¬Òò¶øËüÊǼ̳йØÏµµÄÖյ㡣
ÕâÀïÎÒÃÇÊ×ÏÈÒªÖªµÀprototypeºÍprotoÊÇÁ½ÖÖÊôÐÔ£¬Ç°ÕßÖ»ÓÐfunction²ÅÓУ¬ºóÕßËùÓеĶÔÏó¶¼ÓС£ºóÃæ»áÏêϸ½²µ½¡£
1. JavaScriptÀࣿ
Javascript Ö»ÓÐÒ»Öֽṹ£º¶ÔÏó¡£ÀàµÄ¸ÅÄîÓִӺζøÀ´£¿
ÔÚJavaScriptÖÐÎÒÃÇ¿ÉÒÔͨ¹ýfunctionÀ´Ä£ÄâÀ࣬ÀýÈçÎÒÃǶ¨
ÒåÒ»¸öMyPointµÄº¯Êý£¬²¢°ÑËûÈÏ×÷MyPointÀ࣬¾Í¿ÉÒÔͨ¹ýnewÀ´´´½¨¾ßÓÐx£¬yÊôÐԵĶÔÏó
function MyPoint(x, y) { this.x = x; this.y = y; }
var point = new MyPoint(99, 66); |
´òÓ¡point¶ÔÏó½á¹¹£º

ÕâÀï³öÏÖÒ»¸öconstructorµÄ¸ÅÄî
2. JavaScript constructor
ÿ¸öJavaScriptº¯Êý¶¼×Ô¶¯ÓµÓÐÒ»¸öprototypeµÄÊôÐÔ£¬Õâ¸öprototypeÊôÐÔÊÇÒ»¸ö¶ÔÏó£¬Õâ¸ö¶ÔÏó°üº¬Î¨Ò»Ò»¸ö²»¿Éö¾ÙÊôÐÔconstructor¡£constructorÊôÐÔÖµÊÇÒ»¸öº¯Êý¶ÔÏó
Ö´ÐÐÒÔÏ´úÂëÎÒÃǻᷢÏÖ¶ÔÓÚÈÎÒ⺯ÊýF.prototype. constructor
== F
var F = function(){}; //Ò»¸öº¯Êý¶ÔÏóF
var p = F.prototype; //F¹ØÁªµÄÔÐͶÔÏó
var c = p.constructor; //ÔÐͶÔÏó¹ØÁªµÄ
constructorº¯Êý
c == F // =>true: ¶ÔÓÚÈÎÒ⺯ÊýF.prototype
.constructor == F |
ÕâÀï¼´´æÔÚÒ»¸ö·´ÏòÒýÓõĹØÏµ£º

3. new·¢ÉúÁËʲô£¿
µ±µ÷ÓÃnew MyPoint(99, 66)ʱ£¬ÐéÄâ»úÉú³ÉÁËÒ»¸öpoint¶ÔÏ󣬲¢µ÷ÓÃÁËMyPointµÄprototypeµÄconstructor¶ÔÏó¶Ôpoint½øÐгõʼ»¯£¬²¢ÇÒ×Ô¶¯½«MyPoint.prototype×÷ΪжÔÏópointµÄÔÐÍ¡£
Ï൱ÓÚÏÂÃæµÄα´úÂë
var point ; point = MyPoint.prototype.constructor(99,66); point.__proto__ = MyPoint.prototype; |
4. _ proto __ Óëprototype
¼òµ¥µØËµ£º
1._proto__ÊÇËùÓжÔÏóµÄÊôÐÔ£¬±íʾ¶ÔÏó×Ô¼º¼Ì³ÐÁËʲô¶ÔÏó
2.prototypeÊÇFunctionµÄÊôÐÔ£¬¾ö¶¨ÁËnew³öÀ´µÄжÔÏóµÄproto
ÈçͼÏêϸ½âÊÍÁËÁ½ÕßµÄÇø±ð

5. ´òÓ¡JavaScript¶ÔÏó½á¹¹
1.ÔÚä¯ÀÀÆ÷ÌṩµÄJavaScriptµ÷ÊÔ¹¤¾ßÖУ¬ÎÒÃÇ¿ÉÒԺܷ½±ãµØ´òÓ¡³öJavaScript¶ÔÏóµÄÄÚ²¿½á¹¹
2.ÔÚMac/iOS¿Í»§¶ËJavaScriptCoreÖв¢Ã»ÓÐÕâÑùµÄ´òÓ¡º¯Êý£¬ÕâÀïÎÒ×Ô¶¨ÒåÁËÒ»¸ö´òÓ¡º¯Êý¡£¼øÓÚ¶ÔÏóµÄÄÚ²¿½á¹¹ÈÝÒ׳öÏÖÑ»·ÒýÓõ¼Öµü´ú´òÓ¡ÏÝÈëËÀÑ»·£¬ÎÒÃÇÔÚÕâÀï¼òµ¥µØ´¦Àí£¬¶ÔÊôÐÔ²»½øÐеü´ú´òÓ¡¡£ÎªÁËÃèÊö¶ÔÏóµÄÔÐÍÁ´£¬ÕâÀïÊÖ¶¯ÔÚ¶ÔÏóĩβ¶ÔÆäÔÐͽøÐдòÓ¡¡£
function __typeof__(objClass) { if ( objClass && objClass.
constructor ) { var strFun = objClass.
constructor.toString(); var className = strFun.substr
(0, strFun.indexOf('(')); className = className.replace
('function', ''); return className.replace
(/(^\s*)|(\s*$)/ig, ''); } return typeof(objClass); }
function dumpObj(obj, depth) {
if (depth == null || depth ==
undefined) {
depth = 1;
}
if (typeof obj != "function" &&
typeof obj != "object") {
return '('+__typeof__(obj)+')' +
obj.toString();
}
var tab = ' ';
var tabs = '';
for (var i = 0; i<depth-1; i++) {
tabs+=tab;
}
var output = '('+__typeof__
(obj)+') {\n';
var names = Object.getOwnProper
tyNames(obj);
for (index in names) {
var propertyName = names[index];
try {
var property = obj[propertyName];
output += (tabs+tab+propertyName + '
= ' + '('+__typeof__(property)+')'
+property.toString()+ '\n');
}catch(err) {
output += (tabs+tab+propertyName +
' = ' + '('+__typeof__(property)+')'
+ '\n');}}var prt = obj.__proto__;
if (typeof obj == "function") {
prt = obj.prototype;
}
if (prt!=null && prt!= undefined)
{
output += (tabs+tab+'proto = ' + dump
Obj(prt, depth+1) + '\n');
}else {
output += (tabs+tab+'proto = '+prt+' \n');
}
output+=(tabs+'}');
return output;
}
function printObj(obj) {
log(dumpObj(obj));
} |
6. log
ÎÒÃÇΪËùÓеÄcontext¶¼Ìí¼ÓÒ»¸ölogº¯Êý£¬·½±ãÎÒÃÇÔÚJSÖÐÏò¿ØÖÆÌ¨Êä³öÈÕÖ¾
context[@"log"] = ^(NSString *log) { NSLog(@"%@", log); }; |
¾Å¡¢ µ¼³öOC¶ÔÏó¸øJS
ÏÖÔÚÎÒÃǼÌÐø»Øµ½Objective-CÖУ¬¿´ÏÂOC¶ÔÏóÊÇÈçºÎµ¼³öµÄ
1. ¼òµ¥¶ÔÏóµÄµ¼³ö
µ±Äã´ÓÒ»¸öδָ¶¨¿½±´ÐÒéµÄObjective-CʵÀý´´½¨Ò»¸öJavaScript¶ÔÏóʱ£¬JavaScriptCore»á´´½¨Ò»¸öJavaScriptµÄwrapper¶ÔÏó¡£¶ÔÓÚ¾ßÌåÀàÐÍ£¬JavaScriptCore»á×Ô¶¯¿½±´Öµµ½ºÏÊʵÄJavaScriptÀàÐÍ¡£
ÒÔÏ´úÂ붨ÒåÁËÒ»¸ö¼Ì³Ð×ÔNSObjectµÄ¼òµ¥Àà
@interface DPoint : NSObject
@property (nonatomic, retain)
NSString *type;
@end |
µ¼³ö¶ÔÏó
DPoint *dPoint = [[DPoint alloc] init]; dPoint.type = @"Hello Point!"; //µ¼³ö¶ÔÏó context[@"d_point"] = dPoint; [context evaluateScript:@"printObj(d_point)"]; |
È»ºóÎÒÃÇ´òÓ¡JavaScriptÖеÄd_point¶ÔÏó½á¹¹ÈçÏ£º
//Output () { proto = () { constructor = (Object)[object
DPointConstructor] proto = (Object) { toString = (Function)function
toString() { [native code] } toLocaleString = (Function)function
toLocaleString() { [native code] } valueOf = (Function)function
valueOf() { [native code] } hasOwnProperty = (Function)function
hasOwnProperty() { [native code] } propertyIsEnumerable = (Function)
function propertyIsEnumerable() { [native code] } isPrototypeOf = (Function)function
isPrototypeOf() { [native code] } __defineGetter__ = (Function)function
__defineGetter__() { [native code] } __defineSetter__ = (Function)function
__defineSetter__() { [native code] } __lookupGetter__ = (Function)function
__lookupGetter__() { [native code] } __lookupSetter__ = (Function)function
__lookupSetter__() { [native code] } __proto__ = (object) constructor = (Function)function
Object() { [native code] } proto = null } } } |
¿É¼û£¬ÆätypeÊôÐÔ²¢Ã»Óб»µ¼³ö¡£
JSÖеĶÔÏóÔÐÍÊǾÍÊÇObject.prototype¡£
2. ¼Ì³Ð¹ØÏµµÄµ¼³ö
ÔÚJavaScriptÖУ¬¼Ì³Ð¹ØÏµÊÇͨ¹ýÔÐÍÁ´£¨prototype chain£©À´Ö§³ÖµÄ¡£¶ÔÓÚÿһ¸öµ¼³öµÄObjective-CÀ࣬JavaScriptCore»áÔÚcontextÖд´½¨Ò»¸öprototype¡£¶ÔÓÚNSObjectÀ࣬Æäprototype¶ÔÏó¾ÍÊÇJavaScript
contextµÄObject.prototype¡£
¶ÔÓÚËùÓÐÆäËûµÄObjective-CÀ࣬JavaScriptCore»á´´½¨Ò»¸öprototypeÊôÐÔÖ¸ÏòÆä¸¸ÀàµÄÔÐÍÊôÐÔµÄÔÐͶÔÏó¡£Èç´Ë£¬JavaScriptÖеÄwrapper¶ÔÏóµÄÔÐÍÁ´¾Í·´Ó³ÁËObjective-CÖÐÀàÐ͵ļ̳йØÏµ¡£
ÎÒÃÇÈÃDPoint¼Ì³Ð×ÓMyPoint
@interface DPoint : MyPoint
@property (nonatomic, retain) NSString *type;
@end |
ÔÚOCÖУ¬ËüµÄ¼Ì³Ð¹ØÏµÊÇÕâÑùµÄ

ÔÚJSÖУ¬ËüµÄ¼Ì³Ð¹ØÏµÊÇÕâÑùµÄ

´òÓ¡¶ÔÏó½á¹¹À´ÑéÖ¤£º
//µ¼³öÀà context[@¡°DPoint"] = [DPoint class] ; [context evaluateScript:@¡°log(Dpoint
.prototype.constructor==DPoint)"]; [context evaluateScript:@"printObj(DPoint)"]; |
Output:
true (Function) { name = (String)DPoint prototype = (DPoint)[object
DPointPrototype] proto = (DPoint) { constructor = (Function)function
DPoint() { [native code] } proto = (MyPoint) {
constructor = (Function)function
MyPoint() { [native code] } description = (Function)function
() { [native code] } x = (Function) y = (Function) proto = (Object) { toString = (Function)function toString
() { [native code] } toLocaleString = (Function)function
toLocaleString() { [native code] } ¡¡ __proto__ = (object) constructor = (Function)function
Object() { [native code] } proto = null } } } } |
¿É¼û£¬DPoint×ÔÉíµÄδµ¼³öµÄÊôÐÔtypeûÓÐÔÚJS¶ÔÏóÖз´Ó¦³öÀ´£¬Æä¼Ì³ÐµÄMyPointµÄµ¼³öµÄÊôÐԺͺ¯Êý¶¼ÔÚJS¶ÔÏóµÄÔÐÍÖС£
Ê®¡¢ ÄÚ´æ¹ÜÀí
1. Ñ»·ÒýÓÃ
֮ǰÒѾ½²µ½£¬ ÿ¸öJSValue¶ÔÏó¶¼³ÖÓÐÆäJSContext¶ÔÏóµÄÇ¿ÒýÓã¬Ö»ÒªÓÐÈκÎÒ»¸öÓëÌØ¶¨JSContext¹ØÁªµÄJSValue±»³ÖÓУ¨retain£©£¬Õâ¸öJSContext¾Í»áÒ»Ö±´æ»î¡£Èç¹ûÎÒÃǽ«Ò»¸önative¶ÔÏóµ¼³ö¸øJavaScript£¬¼´½«Õâ¸ö¶ÔÏó½»ÓÉJavaScriptµÄÈ«¾Ö¶ÔÏó³ÖÓÐ
£¬ÒýÓùØÏµÊÇÕâÑùµÄ£º

ÕâʱÈç¹ûÎÒÃÇÔÚnative¶ÔÏóÖÐÇ¿ÒýÓóÖÓÐJSContext»òÕßJSValue£¬±ã»áÔì³ÉÑ»·ÒýÓãº

Òò´ËÔÚʹÓÃʱҪעÒâÒÔϼ¸µã£º
2. ±ÜÃâÖ±½ÓʹÓÃÍⲿcontext
1.±ÜÃâÔÚµ¼³öµÄblock/nativeº¯ÊýÖÐÖ±½ÓʹÓÃJSContext
2.ʹÓà [JSContext currentContext] À´»ñÈ¡µ±Ç°contextÄܹ»±ÜÃâÑ»·ÒýÓÃ
//´íÎóÓ÷¨ context[@"block"] = ^() { NSLog(@"%@", context); };
//¾ÀÕýÓ÷¨
context[@"block"] = ^() {
NSLog(@"%@", [JSContext currentContext]);
}; |
3. ±ÜÃâÖ±½ÓʹÓÃÍⲿJSValue
±ÜÃâÔÚµ¼³öµÄblock/nativeº¯ÊýÖÐÖ±½ÓʹÓÃJSValue
//´íÎóÓ÷¨ JSValue *value = [JSValue valueWith
Object:@"test¡° inContext:context]; context[@"block"] = ^(){ NSLog(@"%@", value); };
//¾ÀÕýÓ÷¨
JSValue *value = [JSValue valueWith
Object:@"test¡° inContext:context];
JSManagedValue *managedValue = [JSManagedValue
managedValueWithValue:value andOwner:self];
context[@"block"] = ^(){
NSLog(@"%@", [managedValue value]);
} |
ÕâÀïÎÒÃÇʹÓÃÁËJSManagedValueÀ´½â¾öÕâ¸öÎÊÌâ
ʮһ¡¢ JSManagedValue
1.Ò»¸öJSManagedValue¶ÔÏó°üº¬ÁËÒ»¸öJSValue¶ÔÏ󣬡°ÓÐÌõ¼þµØ³ÖÓУ¨conditional
retain£©¡±µÄÌØÐÔʹÆä¿ÉÒÔ×Ô¶¯¹ÜÀíÄÚ´æ¡£
2.×î»ù±¾µÄÓ÷¨¾ÍÊÇÓÃÀ´ÔÚµ¼Èëµ½JavaScriptµÄnative¶ÔÏóÖд洢JSValue¡£
3.²»ÒªÔÚÔÚÒ»¸öµ¼³öµ½JavaScriptµÄnative¶ÔÏóÖгÖÓÐJSValue¶ÔÏó¡£ÒòΪÿ¸öJSValue¶ÔÏó¶¼°üº¬ÁËÒ»¸öJSContext¶ÔÏó£¬ÕâÖÖ¹ØÏµ½«»áµ¼ÖÂÑ»·ÒýÓã¬Òò¶ø¿ÉÄÜÔì³ÉÄÚ´æÐ¹Â©¡£
1. ÓÐÌõ¼þµØ³ÖÓÐ
1.Ëùν¡°ÓÐÌõ¼þµØ³ÖÓУ¨conditional retain£©¡±£¬ÊÇÖ¸ÔÚÒÔÏÂÁ½ÖÖÇé¿öÈκÎÒ»¸öÂú×ãµÄÇé¿öϱ£Ö¤Æä¹ÜÀíµÄJSValue±»³ÖÓУº¿ÉÒÔͨ¹ýJavaScriptµÄ¶ÔÏóͼÕÒµ½¸ÃJSValue
2.¿ÉÒÔͨ¹ýnative¶ÔÏóͼÕÒµ½¸ÃJSManagedValue¡£Ê¹ÓÃaddManagedReference:withOwner:·½·¨¿ÉÏòÐéÄâ»ú¼Ç¼¸Ã¹ØÏµ·´Ö®£¬Èç¹ûÒÔÉÏÌõ¼þ¶¼²»Âú×㣬JSManagedValue¶ÔÏó¾Í»á½«ÆävalueÖÃΪnil²¢ÊͷŸÃJSValue¡£
3.JSManagedValue¶ÔÆä°üº¬µÄJSValueµÄ³ÖÓйØÏµÓëARCϵÄÐéÒýÓã¨weak
reference£©ÀàËÆ¡£
2. Ϊʲô²»Ö±½ÓÓÃÐéÒýÓã¿
ͨ³£ÎÒÃÇʹÓÃweakÀ´ÐÞÊÎblockÄÚÐèҪʹÓõÄÍⲿÒýÓÃÒÔ±ÜÃâÑ»·ÒýÓã¬ÓÉÓÚJSValue¶ÔÓ¦µÄJS¶ÔÏóÄÚ´æÓÉÐéÄâ»ú½øÐйÜÀí²¢¸ºÔð»ØÊÕ£¬ÕâÖÖ·½·¨²»ÄÜ׼ȷµØ¿ØÖÆblockÄÚµÄÒýÓÃJSValueµÄÉúÃüÖÜÆÚ£¬¿ÉÄÜÔÚblockÄÚÐèҪʹÓÃJSValueµÄʱºò£¬ÆäÒѾ±»ÐéÄâ»ú»ØÊÕ¡£
API Reference
/* ¿ÉÒÔÖ±½ÓʹÓÃJSManagedValueµÄ
Àà·½·¨Ö±½ÓÉú²úÒ»¸ö´øownerµÄ¶ÔÏó */ + managedValueWithValue:andOwner:
/* Ò²¿ÉÒÔʹÓÃJSVirtualMachine
µÄʵÀý·½·¨À´ÊÖ¶¯¹ÜÀí */
addManagedReference:withOwner:
removeManagedReference:withOwner:
/* owner¼´JSValueÔÚnative´úÂëÖÐ
ÒÀÍеĶÔÏó£¬ÐéÄâ»ú¾ÍÊÇͨ¹ýownerÀ´
È·ÈÏnativeÖеĶÔÏóͼ¹ØÏµ */ |
Ê®¶þ¡¢ Òì³£´¦Àí
1.JSContextµÄexceptionHandlerÊôÐÔ¿ÉÓÃÀ´½ÓÊÕJavaScriptÖÐÅ׳öµÄÒì³£
2.ĬÈϵÄexceptionHandler»á½«exceptionÉèÖøøcontextµÄexceptionÊôÐÔ
3.Òò´Ë£¬Ä¬ÈϵıíÏÖ¾ÍÊÇ´ÓJavaScriptÖÐÅ׸ønativeµÄδ´¦ÀíµÄÒì³£ÓÖ±»Å׻ص½JavaScriptÖÐ
£¬Òì³£²¢Î´±»²¶»ñ´¦Àí¡£
4.½«context.exceptionÉèÖÃΪnil½«»áµ¼ÖÂJavaScriptÈÏΪÒì³£ÒѾ±»²¶»ñ´¦Àí¡£
@property (copy) void(^exceptionHandler)
(JSContext *context, JSValue *exception);
context.exceptionHandler = ^(JSContext
*context, JSValue *exception) {
NSLog(@"exception : %@", exception);
context.exception = exception;
}; |
|