我的理解是,使用JavaScript a" function",是一个函数,但也可以是构造函数,也可以是对象本身。如果我设计一个函数(如返回),但也像构造函数一样,我是否可以访问返回值和函数范围之外的属性?像这样
function Tree() {
this.name = "Boris";
var age = 18
var cookies = "cookies" // defined with var instead of this.cookies
return age;
}
var r1 = Tree(); // r1 == 18
r1.name // undefined
var r2 = new Tree(); // r2 == { name: "Boris" }, but no age or cookies
那么我可以使用同一个对象访问名称,年龄和Cookie吗?我越来越想到这一点,出于安全原因,我想做的事情可能是不可能的,但我仍然想知道。
使用obj.constructor()
,您再次可以访问用于创建obj的函数,从而获得返回值。注意:前缀为new
将返回另一个对象,而不是返回值。
var r2 = new Tree(); // r2 == { name: "Boris" }
r2.constructor() // 18
new r2.constructor() // { name: "Boris" }, not what I want
我无法找到一种方法来访问用var定义的变量。帮助
答案 0 :(得分:1)
不,你不能从功能中获得变量。原因 - function scopes,看一看。
但如果您仍想获取变量,我建议以这种方式编写代码:
function Tree() {
this.name = "Boris";
this.age = 18;
return this;
}
因此,如果您想要访问变量,则需要使用this
。
OR
您可以在原型中定义属性。例如:
function Tree() {
this.name = 'Boris';
return this;
}
Tree.prototype = Object.create({
age: 18
});
var tree = new Tree();
tree.name == 'Boris'; // true
tree.age == 18; // true
但如果此变量在函数范围内关闭,则无法访问使用var
定义的变量。
答案 1 :(得分:0)
那么我可以使用同一个对象访问名称,年龄和Cookie吗?
否,此"不可访问性"有助于在javascript中实现种私有变量和封装。
function Tree() {
if (!this) return new Tree();
this.name = "Boris";
var age = 18
var cookies = "cookies" // defined with var instead of this.cookies
this.getAge = function() { return age; };
this.getCookies = function() { return cookies; };
}
答案 2 :(得分:0)
使用new
关键字调用时,函数被视为构造函数。例如:
function Cat(name) {
this.name = name;
return "my name is " + this.name;
}
var a = new Cat("barry");
var b = Cat("larry");
这里,a
被分配给使用Cat
函数作为构造函数的结果,而b
是将Cat
作为普通函数调用的结果。 typeof b
将为"string"
,因为结果只是函数的返回值。
typeof a
将为"object"
,因为new关键字会更改表达式行为 - 它会生成一个新对象,并以这种方式调用构造函数(称为绑定)this
变量是对该对象的引用。正如您所指出的那样,该表达式的结果是this
对象,不是返回值。
您似乎想要描述的是私有变量 - 即在对象函数中可访问的变量(例如a.addOneToAge()
),而不是通过a.age
或类似的直接引用。虽然通常可以在JavaScript中使用闭包,但这对于对象来说是不可能的(我知道)。