【发布时间】:2012-07-23 02:23:26
【问题描述】:
我想出了以下情况:
function Dog () {
"use strict";
this.age = 1;
var name = "Fido";
this.getName = function () { return name; }
}
现在我正在创建“Dog”类的新实例并打印变量的值。
var d = new Dog;
document.write('<strong>Dog age:</strong> ' +d.age); \\Outputs "1" as expected
document.write('<br/>');
document.write('<strong>Dog name:</strong> ' +d.name); \\Outputs "undefined" as expected, 'cause it's a private variable.
document.write('<br/>');
document.write('<strong>Get Dog name:</strong> ' +d.getName()); \\Outputs "Fido", as expected.
但是假设我想改变狗的名字,像这样:
d.name = "Stinky";
document.write('<br/>');
document.write('<strong>Dog name Again:</strong> ' +d.name);
document.write('<br/>');
document.write('<strong>Get Dog name Again:</strong> ' +d.getName());
基于此,我有几个问题:
- 到底为什么“d.name”没有显示“未定义”? “名称”不是私有变量吗?我想你不能改变私有变量的值,对吗?我想知道这个过程是否创建了一个新变量,但这次是一个公共变量,并且具有相同的名称。如果是这样,有没有办法防止每次我尝试分配具有相同名称的新属性时创建新变量?有没有办法抛出“类型错误”或其他东西(嗯,这是我所期望的)。
- 最后:为什么“getName”会打印原始值“Fido”,即使在我为其分配了新值之后?
有什么想法吗?
这里有一个让事情变得更容易的fid。
【问题讨论】:
-
它输出
undefined只是因为该属性不完全存在于对象上,而不是因为对象上有私有属性 -
您需要更好地了解closures,然后才能开始了解这里发生了什么。
-
是时候了解一下getters and setters了。
-
Javascript 没有诸如“公共”或“私有”属性之类的东西。属性始终是公开的。您只能在闭包的帮助下实现某种“伪”隐私,该闭包利用 JS 的函数范围(您的变量名就是这种情况)。
标签: javascript variables private getter