javascript - 原型(prototype)问题

标签 javascript prototype

我有一个简单的问题,但我无法理解。

<script type="text/javascript">

var man = function(){

    var age = 1;

    this.shoes = 2;

};

man.prototype = {

    create: function(){

        //age = 5;
        console.log(age);
        console.log(this.shoes);

    }

}
var man1 = new man;
man1.create();
</script>

-好吧,我创建了一个有 2 个变量的男人,年龄和鞋子。我只在鞋子中使用“this”。在我在 man 中构建了一个方法原型(prototype)之后。

-如果我执行此代码,首先 console.log 会告诉我:

Uncaught ReferenceError :年龄未定义(逻辑)

第二个控制台是“2”(正确)。

-如果我写:console.log(this.age),则消息错误为:未定义。

-但是如果我在新方法中输入年龄值 (age=5)(不使用“var”来创建 var),它就会起作用。

如果我在阅读此内容之前输入了值,为什么我只能使用age var?

最佳答案

age 变量位于“constructors”闭包内,这使得它只能在“constructors”闭包中使用。您可以在该函数(闭包)内部使用年龄变量,但不能在外部使用。

如果您想让它可以从外部访问,请将其添加到此或创建一个 getter 函数,例如:

var man = function(){
    var age = 1;
    this.shoes = 2;
    this.getAge = function() { return age; };
};

但是如果你没有在函数内部声明变量,但仍然设置它,那么它将在浏览器窗口中的全局对象上定义。这不会使年龄在 man 对象上可用,但您可以在任何地方访问它。这里需要澄清一下:

function tellAgeDelayedGlobal() {
    age = 1;
    setTimeout(function() { console.log(age) }, 1000);   
}

function tellAgeDelayedDeclared() {
    var age = 1;
    setTimeout(function() { console.log(age) }, 1000);   
}

tellAgeDelayedGlobal();
tellAgeDelayedDeclared();
age = 2;

这将打印到控制台:

2
1

关于javascript - 原型(prototype)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30018167/

相关文章:

javascript - 如何使用jquery获取div的id?

javascript - 如何遍历所有 <p> 元素?

oop - 是否可以在 Scala 中进行基于原型(prototype)的编程?

javascript - 访问原型(prototype)中的主要对象变量

javascript - 在 JavaScript 中定义公共(public)字段的首选方式 : on prototype or constructor?

javascript - 如何观察第三方对象的属性值变化?

javascript - Mocha - 使用 ti-mocha 访问命名函数

javascript - 如何阻止 .focusout() 多次触发?

javascript - 如何使用 Fontselect jQuery 插件以编程方式选择字体?

继承 T 的 typescript 泛型函数