From 218934fa2ed1c702a6d3923d2aa2cc6b43c48684 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:43:23 -0500 Subject: initial commit --- .../javascript/reference/functions/set/index.html | 138 +++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 files/zh-tw/web/javascript/reference/functions/set/index.html (limited to 'files/zh-tw/web/javascript/reference/functions/set') diff --git a/files/zh-tw/web/javascript/reference/functions/set/index.html b/files/zh-tw/web/javascript/reference/functions/set/index.html new file mode 100644 index 0000000000..171d366eb9 --- /dev/null +++ b/files/zh-tw/web/javascript/reference/functions/set/index.html @@ -0,0 +1,138 @@ +--- +title: setter +slug: Web/JavaScript/Reference/Functions/set +translation_of: Web/JavaScript/Reference/Functions/set +--- +
{{jsSidebar("Functions")}}
+ +

set 語法會在物件屬性被嘗試定義時,將其屬性綁定到要呼叫的函式內。

+ +
{{EmbedInteractiveExample("pages/js/functions-setter.html")}}
+ +

語法

+ +
{set prop(val) { . . . }}
+{set [expression](val) { . . . }}
+ +

參數

+ +
+
prop
+
要綁定到給定函式的屬性名。
+
val
+
變數別名,該變數擁有要被嘗試安插到 prop 的數值。
+
expression
+
從 ECMAScript 2015 開始,可以使用計算屬性名(computed property name)表達式,綁定到給定函式。
+
+ +

描述

+ +

JavaScript 的 setter 能在嘗試修改指定屬性時,執行給定函式。Setter 最常用於和 getter 一同建立虛擬屬性(pseudo-property)。你不可能給同一個屬性賦予 setter 與實際值。

+ +

使用 set 語法時,請注意以下情況:

+ +
+ +
+ +

delete 操作符可移除 setter。

+ +

示例

+ +

在物件初始器的新物件定義 setter

+ +

這裡會給物件 language 定義稱為 current 的虛擬屬性。在指派數值時 log 會和該值一同更新:

+ +
var language = {
+  set current(name) {
+    this.log.push(name);
+  },
+  log: []
+}
+
+language.current = 'EN';
+console.log(language.log); // ['EN']
+
+language.current = 'FA';
+console.log(language.log); // ['EN', 'FA']
+
+ +

請注意 current is not defined and any attempts to access it will result in undefined.

+ +

使用 delete 操作符移除 setter

+ +

若想移除 setter 的話,可以直接使用 delete

+ +
delete o.current;
+
+ +

針對已存在屬性的 setter 使用 defineProperty

+ +

To append a setter to an existing object later at any time, use {{jsxref("Object.defineProperty()")}}.

+ +
var o = {a: 0};
+
+Object.defineProperty(o, 'b', { set: function(x) { this.a = x / 2; } });
+
+o.b = 10; // Runs the setter, which assigns 10 / 2 (5) to the 'a' property
+console.log(o.a) // 5
+ +

使用計算屬性名

+ +
var expr = 'foo';
+
+var obj = {
+  baz: 'bar',
+  set [expr](v) { this.baz = v; }
+};
+
+console.log(obj.baz); // "bar"
+obj.foo = 'baz';      // 跑 setter
+console.log(obj.baz); // "baz"
+
+ +

規範

+ + + + + + + + + + + + + + + + + + + + + + + + +
規範狀態註解
{{SpecName('ES5.1', '#sec-11.1.5', 'Object Initializer')}}{{Spec2('ES5.1')}}初始定義。
{{SpecName('ES6', '#sec-method-definitions', 'Method definitions')}}{{Spec2('ES6')}}增加計算屬性名。
{{SpecName('ESDraft', '#sec-method-definitions', 'Method definitions')}}{{Spec2('ESDraft')}} 
+ +

瀏覽器相容性

+ +

{{Compat("javascript.functions.set")}}

+ +

參見

+ + -- cgit v1.2.3-54-g00ecf