![](/img/trans.png)
[英]how to make modular, oo “animations” with canvas / JavaScript?
[英]How to make modular constants in javascript
我是封裝的堅信者,使用javascript很難做到這一點。 我希望能夠使用未在全局級別定義的常量,但無法完成此示例:
html
<!DOCTYPE html>
<body>
<p>
<b>some examples</b>
</p>
<p>
<script>some.STRING</script><br>
<script>some.ARRAY.join(' - ')</script>
</p>
</body>
javascript
// some.js
var some = (function () {
return {
STRING: 'some string',
ARRAY: ["some", "data", "in", "an", "array"]
};
}
);
我希望輸出包含下面的兩行
some string
some - data - in - an - array
jsfiddle: https ://jsfiddle.net/p3kgpx70/4/
將表達式放在腳本中不會將其值添加到頁面中。 您需要調用一個函數來做到這一點。 頁面加載時,可以使用document.write()
。
<script>
document.write(some.STRING);
document.write(some.ARRAY.join(' - ');
</script>
document.write()
是老式的。 最好使用諸如document.getElementById()
類的DOM操作函數並將其分配給.innerHTML
。
您也沒有正確分配some
。 您需要調用該函數以獲取對象。
var some = (function () {
return {
STRING: 'some string',
ARRAY: ["some", "data", "in", "an", "array"]
};
}
)();
或者您可以忘記IIFE,而直接分配對象。
var some = {
STRING: 'some string',
ARRAY: ["some", "data", "in", "an", "array"]
};
這是一個小提琴: https://jsfiddle.net/p3kgpx70/6/
: https://jsfiddle.net/p3kgpx70/6/
// some.js
var some = (function () {
return {
STRING: 'some string',
ARRAY: ["some", "data", "in", "an", "array"]
};
}
)();
element.innerHTML += some.STRING + "</br>";
element.innerHTML += some.ARRAY.join(' - ');
錯誤#1:IIFE必須包裝在
(function(){})()
錯誤#2:將表達式放入腳本中不會將其值添加到頁面中。 您必須更改DOM才能將值寫入頁面。 如果將它放在p
元素中,則document.write(some.STRING)
(@ Barmar)將引發錯誤。 因此,我在some
變量定義之后使用了element.innerHTML來寫入值。
#3
(不是一個真正的錯誤:不是的var
,你可以用const
做some
常數。
現在,更加不容錯過!
// some.js
const object = {};
Object.defineProperty(object, "some", {get: function () {
return {
STRING: 'some string',
ARRAY: ["some", "data", "in", "an", "array"]
};
}})
element.innerHTML += object.some.STRING + "</br>";
element.innerHTML += object.some.ARRAY.join(' - ');
object.some.STRING = 6;
console.log(object.some); // still not changed
在第一個代碼塊中,如果我設置some.STRING = 6,則值將被更改。 如果要使其不可變,則必須使object = {}
為常量,然后將屬性some
的getter
等於您的函數。 每次你得到的價值object.some
,它仍然是相同的,即使你改變的值object.some
這樣的: object.some.STRING = 6;
。 那是因為您發明了神奇的功能。 我為你寫了包裝紙。
在JavaScript中,您無法設置全局變量的getter
/ setter
(無父項)。 抱歉。
在您的示例中,您將“ some”聲明為一個函數,而不是一個對象。 您寧願:
// some.js
var some = (function () {
return {
STRING: 'some string',
ARRAY: ["some", "data", "in", "an", "array"]
};
}
)();
最后兩個括號用於執行該函數,並讓“ some”成為該對象。
但是 ,“ some”仍然是可以輕松操縱的window屬性。 僅解決了一個語法上的問題,但未提供封裝。 您可以這樣做:some.Array ='foo'; 最近在您的腳本中,那會很好。 ES6關鍵字“ const”並不能阻止這種情況:“ const”僅禁止重新分配變量,而不能對其進行修改。 因此,“ const some”將無法使這些值真正恆定。
如果您真的很喜歡封裝,則應該檢查javascript和模塊模式中的閉包,還應該了解一些使用browserify或webpack模塊化構建javascript的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.