Sean's Note: JavaScript
顯示具有 JavaScript 標籤的文章。 顯示所有文章
顯示具有 JavaScript 標籤的文章。 顯示所有文章

2013年12月6日 星期五

Using Prototype in JavaScript

用 JavaScript 所建立的物件都繼承了 Object 這個最頂層的物件,

而 Object 物件含有 prototype 這個屬性(Property) 。
 
var myObject = {} // 等同於 var myObject = new Object()
 
沒用到 prototype 時,每個實體(killerRabbit 和 cuteRabbit) 都擁有各自的 name 屬性,

卻沒有共同的屬性:

    
function Rabbit(name) {
  this.name = name
}

var killerRabbit = new Rabbit("killer");
var cuteRabbit = new Rabbit("cute");

所以如果這兩隻兔子想要共用屬性時,prototype 就可以派上用場:

function Rabbit(name) {
  this.name = name
}
Rabbit.prototype.printName = function(){
    print('My name is: ', this.name)
};

由於 Rabbit 有 prototype,Object 又有 prototype,那尋訪的順序是? 看看下面的例子:
Object.prototype.teeth = "normal";
function Rabbit() {
  this.teeth = 'big'
}
Rabbit.prototype.teeth = "small";
var killerRabbit = new Rabbit("killer");
print(Rabbit.prototype.teeth)        // small
print(Rabbit.teeth)                  // normal
print(killerRabbit.teeth)            // big
print(killerRabbit.prototype.teeth)  // Exception: TypeError: Cannot read property 'teeth' of undefined

當查看一個物件的屬性時,JavaScript 會:
  1. 先看該物件實體(this) 有無該屬性。
  2. 在看該物件的 prototype 物件有無該屬性。
  3. 最後看 Object 物件的 prototype 物件有無該屬性,沒有的話則給予 undefined。

參考資料:http://eloquentjavascript.net/chapter8.html

2013年5月23日 星期四

Resolution getting from android device is different from spec.

今天在玩 Toshiba AT500 時,發現規格上寫的解析度是 1280x800,

寫程式時卻要到了 1280x752。

( EX: getWindowManager().getDefaultDisplay().getMetrics(metrics); )

不過實際上 AP 能顯示的的確是 Height: 752 沒錯,因為下面還有一條 Status Bar!

但在使用 WebView(fillparent) 時,

JavaScript 是把解析度當成 1280x800 來看,

(window.screen.availWidth = 1280, window.screen.availHeight = 800)

CSS 則是把解析度當成 1280x752。

除此之外,背景圖像若設的跟 WebView 一樣大,影像將會超過 WebView 幾個 pixel,

若要貼得漂亮,就只能在減掉這些 pixel。

2012年12月11日 星期二

[Android] 印出 JavaScript 的 log

我們都知道在網頁開發中,在 JavaScript 裡打上 console.log() 就可以用 Tools 看 log,
同樣的,在開發 Android 1.6 以下的 Web Apps 時,用 console.log() 也可以將 log 印在
Eclipse 端的 LogCat 或手機端的 aLogcat。 在 Android 2.1 (API Level 7) 以上,則必須實做
WebChromeClient 並 override onConsoleMessage() callback 方法。

(詳見: Android Developers)

實測案例:
1. Samsung Galaxy R (Android 4.0.4):  console.log() 無用,必須 override callback 方法。
2. Toshiba AT500 (Android 4.0.3):  console.log() 可直接印出 Tag 為 Console Web 的訊息。

Note:
  1.  AT500 安裝 ADB USB Driver 的方法
  2. 手機上的 aLogcat, CatLog 等 App,因為新的安全政策,已無法在
    Android 4.1 (Jelly Bean) 上的裝置印出 log,除非 root 過,詳見


2012年12月5日 星期三

在 JavaScript 中常用的 bind 方法

有時候我們會頻繁的使用某個 Object 底下的函式,

於是不斷的呼叫 Object.func() ...

我們可以利用 bind 技巧的實現,省去一些程式碼的撰寫。

bind 顧名思義,就是將某個 object 和函式綁定在一起。

範例如下:

function bind(object, func)
{
  return function()
   {
      return func.apply(object, arguments);
   };
}

var testArray = [];
var pushToTest = bind(testArray, testArray.push);

pushToTest("A");
pushToTest("B");
show(testArray); // ["A", "B"]

2012年11月29日 星期四

[JavaScript] function 函數

JavaScript 的 function 與 C/C++ 不同的地方有三點:

1. function 可被定義在另一個 function 裡
function MakeMulFunction(amout)
{
  function Mul(number)
  {
    return number*amout;
  }
  return Mul;
}

2. 允許匿名函式 (Anonymous Function)
function MakeMulFunction(amout)
{
  return function (number)
  {
    return number*amout;
  }
}

3. 可用變數來定義 function (類似 C/C++ function pointer 的功能)
var Add = function(a, b) { return a+b; };