Skip to content

Commit f146e09

Browse files
committed
私有属性和方法 一节翻译完毕
1 parent 499751f commit f146e09

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

chapter5.markdown

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,5 +338,51 @@ JavaScript不像Java或者其它语言,它没有专门的提供私有、保护
338338
var toy = new Gadget();
339339
console.log(toy.getName()); // privileged "own" method console.log(toy.getBrowser()); // privileged prototype method
340340

341+
### 将私有函数暴露为公有方法
341342

343+
“暴露模式”是指将已经有的私有函数暴露为公有方法。当对对象进行操作时,所有功能代码都对这些操作很敏感,而你想尽量保护这些代码的时候很有用。(译注:指对来自外部的修改很敏感。)但同时,你又希望能提供一些功能的访问权限,因为它们会被用到。如果你把这些方法公开,就会使得它们不再健壮,你的API的使用者可能修改它们。在ECMAScript5中,你可以选择冻结一个对象,但在之前的版本中不可用。下面进入暴露模式(原来是由Christian Heilmann创造的模式,叫“暴露模块模式”)。
344+
345+
我们来看一个例子,它建立在对象字面量的私有成员模式之上:
346+
347+
var myarray;
348+
349+
(function () {
350+
351+
var astr = "[object Array]",
352+
toString = Object.prototype.toString;
353+
354+
function isArray(a) {
355+
return toString.call(a) === astr;
356+
}
357+
358+
function indexOf(haystack, needle) {
359+
var i = 0,
360+
max = haystack.length;
361+
for (; i < max; i += 1) {
362+
if (haystack[i] === needle) {
363+
return i;
364+
}
365+
}
366+
return −1;
367+
}
368+
369+
myarray = {
370+
isArray: isArray,
371+
indexOf: indexOf,
372+
inArray: indexOf
373+
};
374+
375+
}());
376+
377+
这里有两个私有变量和两个私有函数——`isArray()``indexOf()`。在包裹函数的最后,使用那些允许被从外部访问的函数填充`myarray`对象。在这个例子中,同一个私有函数 `indexOf()`同时被暴露为ECMAScript 5风格的`indexOf`和PHP风格的`inArry`。测试一下myarray对象:
378+
379+
myarray.isArray([1,2]); // true
380+
myarray.isArray({0: 1}); // false
381+
myarray.indexOf(["a", "b", "z"], "z"); // 2
382+
myarray.inArray(["a", "b", "z"], "z"); // 2
383+
384+
现在假如有一些意外的情况发生在暴露的`indexOf()`方法上,私有的`indexOf()`方法仍然是安全的,因此`inArray()`仍然可以正常工作:
385+
386+
myarray.indexOf = null;
387+
myarray.inArray(["a", "b", "z"], "z"); // 2
342388

0 commit comments

Comments
 (0)