`
rensanning
  • 浏览: 3552707 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:38219
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:607616
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:682788
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:89538
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:402152
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69761
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:91835
社区版块
存档分类
最新评论

什么是Titanium的“proxy”对象?

阅读更多
【官方地址】http://developer.appcelerator.com/blog/2012/02/what-is-a-titanium-proxy-object.html

如果你经常关注我们的开发Blog,而且阅读了我们基于wiki的文档,你可能会多次看到过“proxy对象”的说法。简单来说,proxy是一个特殊的JavaScript对象,用来代替原生(iOS或者Android,在mobile web是不需要这个)代码的相应对象。

//这里的"button"就是一个proxy对象
var button = Ti.UI.createButton({
	title:'push me!',
        height:50,
        width:200
});


如果你想详细的知道什么是proxy?它如何工作的?可以查看Module开发指南,它详细讲解了为iOS或者Android开发你自己Module的整个过程。

任何时候你访问Ti.* JavaScript命名空间中的函数或者属性,或者使用从这个命名空间的函数返回的对象时,这个对象就是某种类型的proxy。

为了更好的实现JavaScript Conext和原生代码的“桥接”,这些proxy对象被赋予了特殊的功能:允许原生代码(Java, C, 或Objective-C)拦截对象的分配以及函数的调用。这种交互的模式允许开发者能使用JavaScript编写原生代码,使Titanium有别于许多其他跨平台工具。

Proxy是特殊的
作为Titanium平台的使用者,理解这些对象的是很有帮助的,至少在Titanium1.X或者可能在Titanium2.X的很长一段时间里,proxy对象不会总是顺从JavaScript的规则。那么让我们来看看一些没有延续JavaScript规则的地方。

嵌套对象
对于普通的JavaScript对象,你可以为对象(只要这些属性对象存在)设置嵌套属性,比如“meaning.of.life = 42;”,但对于Proxy对象来说是不可以的。一个比较有代表性的例子,你会用到Label的“font”属性,比如如下例子中,“l”是一个Proxy对象,它有一个内嵌的属性“font”,然后为它设置 fontSize。当我们试着直接给它设置嵌套属性fontSize的时候,它是不能够运行的,而是必须设置整个font对象给这个值。

var w = Ti.UI.createWindow({
	backgroundColor:'white'
});
 
var l = Ti.UI.createLabel({
	text:'here is a label',
	font: {
		fontFamily:'Trebuchet MS'
	}
});
w.add(l);
 
//运行不了
l.font.fontSize = 24;
 
//可以正常运行
l.font = {
	fontFamily:'Trebuchet MS',
	fontSize: 24
};
 
w.open();


覆盖属性
Proxy对象的另外一个特殊地方是,对于作为proxy对象的公开接口的函数(Titanium预定使用函数和属性)是不能被复写的。以下是一个典型的例子:

var window = Ti.UI.createWindow({
	backgroundColor:'red'
});
 
window.open = function() {
	alert('overriding open!');
};
 
window.open();

当你运行这段代码时,你会发现,“open”是Proxy对象的一个公共接口函数,我们写得代码只是残留着,并不是我们想想的这个函数被覆盖了。

Getters 和 Setters

特殊的函数名有他们特殊的用处。任何以“get”和“set”开头的函数都被委托给原生代码,所以任何你想设置给Proxy的自定义getter和setter都将会被忽略。

var window = Ti.UI.createWindow({
	backgroundColor:'red'
});
 
window.getSomething = function() {
	alert('getter function');
};
 
window.setSomething = function(something) {
	alert('trying to set '+something);
};
 
window.open();
 
//被忽略
window.getSomething();
window.setSomething('foo');


.apply 和.call

一般你可以使用JavaScript的.apply 和.call的来调用函数,因为函数是一个类对象。但是对于Titanium的Proxy对象来说,由于其有着特殊的构造,是不允许这样被调用的。以下代码虽然是合理的,但是运行之后会出错。
var window = Ti.UI.createWindow.call(this,{
	backgroundColor:'red'
});
window.open();


包装Proxy

有时候这种行为比较烦人,因为对于Ti.*命名空间下的对象,我们想使用JavaScript的所有技巧。当我们使用Proxy处理问题时,一般我们都是在普通的JavaScript对象中包装一个Proxy对象,不直接访问原生Proxy。比如下边这个简单的例子,他可以放到Titanium的根目录下。

Resources/WrappedWindow.js

//Proxy wrapper
function WrappedWindow(args) {
	this.proxy = Ti.UI.createWindow(args);
}
 
WrappedWindow.prototype.open = function(args) {
	this.proxy.open(args);
};
 
WrappedWindow.prototype.setBackgroundColor = function(color) {
	//this works because WrappedWindow is just a plain ol' JS object!
	this.proxy.animate({
		backgroundColor:color,
		duration:4000
	});
};
 
module.exports = WrappedWindow;


Resources/app.js

var WrappedWindow = require('WrappedWindow');
 
var w = new WrappedWindow({
	backgroundColor:'white'
});
 
w.open();
w.setBackgroundColor('red');


使用这个技巧,你可以避开Proxy对象的特殊行为,因为直接操作他们是很麻烦的。

总结

Proxy对象是你使用JavaScript编写原生代码的一个桥梁。然而他们有一些特殊的规则适用于他们。需要特别注意的是:

  • 不能设置嵌套属性
  • 不能复写Proxy对象公开API的属性
  • 以“”和“”开发的函数是被拦截的
  • Proxy对象的.call 和 .apply是不能运行的





分享到:
评论

相关推荐

    Titanium中文版开发手册

    这一部分会详细介绍如何创建和使用模型对象,以及如何通过集合管理一组相关的模型。 10. **Alloy XML Markup** 这一章节专门讨论Alloy的XML标记语言,它是如何与TSS(样式表脚本)和JS(JavaScript)文件配合工作...

    titanium-web-proxy:C# 中的跨平台异步 HTTP(S) 代理服务器

    如需编程帮助,请使用带有标签 Titanium-Web-Proxy 的 。 特征 采用服务器连接池、证书缓存和缓冲池的多线程和异步代理 查看、修改、重定向和阻止请求或响应 支持相互 SSL 认证、代理认证和自动上游代理检测 在 ...

    Titanium-Web-Proxy:C#中的跨平台异步HTTP(S)代理服务器

    要获得编程帮助,请使用带有标签Titanium-Web-Proxy的 。 产品特点 采用服务器连接池,证书缓存和缓冲池的多线程全异步代理 查看/修改/重定向/阻止请求和响应 支持相互SSL身份验证,代理身份验证和自动上游代理检测...

    Titanium plugin开发初探

    【钛合金(Titanium)插件开发初探】 在移动应用开发领域,Titanium 是一个流行的选择,它允许开发者使用 JavaScript 来构建原生的 iOS 和 Android 应用。Titanium 的核心理念是通过跨平台的 JavaScript API 提供与...

    TitaniumBackup_6.0.5.1

    《TitaniumBackup_6.0.5.1:专业版的安卓备份与恢复解决方案》 在安卓设备的管理和维护中,数据备份与恢复是至关重要的环节。TitaniumBackup_6.0.5.1,这款专业版应用,以其强大的功能和高效的操作,为用户提供了...

    Titanium Mobile API

    ### Titanium Mobile API 知识点详解 #### 一、Titanium Mobile API 概述 Titanium Mobile API 是一款由 Appcelerator 公司提供的用于跨平台移动应用开发的强大工具包。该工具允许开发者使用 JavaScript 编写应用...

    Titanium中支持IOS设备的拖拽

    3. **定义拖动代理**:这是iOS原生的一部分,但在Titanium中,你可能需要创建一个JavaScript对象来模拟这个代理,处理拖动过程中的事件,如开始拖动、拖动中和结束拖动。 4. **创建放置目标**:这涉及设置其他可以...

    titanium-appcelerator-pull-to-refresh, 在your中,创建"pull to refresh" 视图的JavaScript方法.zip

    titanium-appcelerator-pull-to-refresh, 在your中,创建"pull to refresh" 视图的JavaScript方法 什么?这种方法,将帮助你在你的篓中制作视图"拖到刷新"。?要使用这里方法,你需要将这些文件包含在项目中:Ti....

    titanium 打开本地网络

    Titanium 是一个强大的开源JavaScript框架,专为开发原生移动应用而设计。它允许开发者使用JavaScript编写代码,同时能够利用iOS、Android等平台的原生功能。在涉及到“titanium 打开本地网络”的话题时,我们主要...

    [Titanium] Appcelerator Titanium 移动应用开发教程 (英文版)

    [Packt Publishing] Appcelerator Titanium 移动应用开发教程 (英文版) [Packt Publishing] Creating Mobile Apps with Appcelerator Titanium (E-Book) ☆ 图书概要:☆ Develop fully-featured mobile ...

    Titanium资料

    最后,`api.json` 文件可能是一个 JSON 格式的 Titanium API 参考,包含 Titanium 的各种对象、方法、属性和事件的详细信息。JSON 格式便于解析和理解,这对于开发者快速查找和学习特定 API 非常有用。 学习这些...

    Titanium Mobile SDK 3.1.0 Apidoc 离线版

    Titanium Mobile SDK 3.1.0 是一个用于构建原生移动应用的开发工具,尤其针对iOS和Android平台。这个版本的Apidoc是开发者的重要参考资料,它包含了完整的API文档,帮助开发者理解并使用Titanium框架的各种功能。...

    Titanium Backup_3.7.4捐赠完全版

    Titanium Backup_3.7.4捐赠完全版

    titanium-d1-kickstart.6.1.1

    titanium-d1-kickstart.6.1.1.gbin 强大的思科模拟器

    前端开源库-node-titanium-sdk

    **前端开源库-node-titanium-sdk** 前端开发领域中,`node-titanium-sdk`是一个重要的开源库,它基于Node.js环境,为开发者提供了一种使用JavaScript开发原生移动应用的途径。`node-titanium-sdk`是Appcelerator ...

    atom-titanium, 用于 Titanium 合金的Atom 封装.zip

    atom-titanium, 用于 Titanium 合金的Atom 封装 用于 Titanium 合金的 All-in-One封装这是一个用于 Titanium 合金的Atom 封装。$ apm install titanium-alloy冲突&需要通知Alloy 1.8. x

    Cisco_N7K模拟器Titanium6.1.1安装方法.docx

    Cisco N7K 模拟器 Titanium 6.1.1 安装方法 本文档将指导用户如何安装 Cisco N7K 模拟器 Titanium 6.1.1,包括虚拟机的设置、模拟器的连接、TFTP 服务器的建立、升级安装包的传输、系统文件的更新等步骤。 一、...

    ecm.titanium-26100.rar

    在本压缩包"ecm.titanium-26100.rar"中,包含的工具专门用于ECU的读写操作,这对于汽车调校、故障诊断以及性能提升等方面具有重要意义。 "KTAG2."标签暗示了这个工具可能属于K-TAG系列的第二代产品。K-TAG是一款由...

    Google-Cloud-Messaging--Titanium-, 在 Titanium 中,Google云消息传递.zip

    Google-Cloud-Messaging--Titanium-, 在 Titanium 中,Google云消息传递 Google-Cloud-Messaging--Titanium -注册带有GCM和处理发送到设备的通知的Titanium MODULE 。Android平台使用c2dm进行推送,但是因为c2dm停止...

Global site tag (gtag.js) - Google Analytics