Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向对象添加方法_Javascript - Fatal编程技术网

Javascript 向对象添加方法

Javascript 向对象添加方法,javascript,Javascript,在javascript中向对象添加方法时,我遇到了一个问题。下面的代码应该返回一个数字,但返回NaN。希望你能帮忙 function people(name, age){ this.name = name; this.age = age; this.numYearsLeft = pension(); } function pension(){ numYears = 65 - this.age; return numYears; } var andrew

在javascript中向对象添加方法时,我遇到了一个问题。下面的代码应该返回一个数字,但返回NaN。希望你能帮忙

function people(name, age){
    this.name = name;
    this.age = age;
    this.numYearsLeft = pension();
}

function pension(){
    numYears = 65 - this.age;
    return numYears;
}

var andrews = new people("Andrews Green", 28);

console.log(andrews.numYearsLeft);

您可以使用原型模型制作
养老金
方法

function people(name, age){
  this.name = name;
  this.age = age;
  this.numYearsLeft = this.pension();  // note the `this`
}

people.prototype.pension = function(){ // note the `prototype`
  var numYears = 65 - this.age;
  return numYears;
};

var andrews = new people("Andrews Green", 28);

console.log(andrews.numYearsLeft);     // 37
使用
prototype
您的
pension
方法将继承构造函数的(
people
)属性(允许您使用
this
关键字引用)。
这样做的另一个好处是,在
人员的每个
新的
实例化上,您不会重新创建
养老金
方法的新实例/调用

JavaScript在“函数作用域”上工作,因此简而言之,您在错误的作用域中。您需要绑定“this”变量,或者使用prototype属性在people类上创建一个函数

您可以将其定义为原型函数

people.prototype.pension = function() {
    numYears = 65 - this.age;
    return numYears;
}

为了调用函数,您需要放入()<代码>console.log(andrews.numYearsLeft)
应该是
console.log(andrews.numyarsleft())

也在

function pension(){
numYears = 65 - this.age;
return numYears;
}
这个年龄是未定义的,因此NaN

(编辑)或许可以试试:

function people(name, age){
    var that = this;
    this.name = name;
    this.age = age;
    this.numYearsLeft = function(){
        numYears = 65 - that.age;
        return numYears;
    };
}
var andrews = new people("Andrews Green", 28);
console.log(andrews.numYearsLeft());
如果在pension中添加console.log()行,您将看到
这是窗口,而不是people对象。更改此
的一种方法是使用call()

例如:

职能人员(姓名、年龄){
this.name=名称;
这个。年龄=年龄;
this.numyarsleft=pension.call(this);
}
职能养老金(){
努迈尔斯=65——这个年龄;
回髓;
}
var andrews=新人(“andrews Green”,28);

console.log(andrews.numYearsLeft)console.log(this)
这是一个引用当前上下文的关键字。在您的
养老金
功能中,
this.age===window.age
,而不是
people.age
。旁注-约定将
people
功能定义为
Person
。以大写字母开头的函数名表示它们是构造函数(可以使用
new
关键字调用函数以创建构造函数的新实例)。创建一个新的“Person”也比创建一个新的“People”更有语法意义。调用
andrews.numyarsleft()
会抛出一个错误,因为
numyarsleft
不是一个函数,而是对调用
pension()
结果的引用。谢谢。我不知道“原型”;非常感谢。
this.numYearsLeft = pension.call(this);