Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
JavaScriptCoreÈ«Ãæ½âÎö £¨ÏÂÆª£©
 
À´Ô´£ºÌÚÑ¶ÔÆ ·¢²¼ÓÚ£º2017-5-26
  2032  次浏览      29
 

Áù¡¢ 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£º

11

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:

99
88

ÔÚ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;
};

   
2032 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì