Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 OOP:Uncaught TypeError:不是函数_Javascript_Oop_Javascript Objects - Fatal编程技术网

JavaScript OOP:Uncaught TypeError:不是函数

JavaScript OOP:Uncaught TypeError:不是函数,javascript,oop,javascript-objects,Javascript,Oop,Javascript Objects,在创建对象时遇到问题。控制台说最后一行有问题。请告诉我应该怎么做,我更熟悉Java,所以这对我来说有点困惑 var dog = { name:"Dog", age:"11", getName : function() { alert(this.name); } } function Dog(name, age) { this.name = name;

在创建对象时遇到问题。控制台说最后一行有问题。请告诉我应该怎么做,我更熟悉Java,所以这对我来说有点困惑

var dog = {
        name:"Dog",
        age:"11",
        getName : function() {
            alert(this.name);       
        }
    }   

    function Dog(name, age) {
        this.name = name;
        this.age = age; 
    }

    var d1 = new Dog("Rex", 8);
    d1.getName();
你的狗只是一个简单的对象文字, 这意味着您的getName绑定到它,而不是您的Dog类

您可以将该函数改为Dog方法:

/*变量狗={ 姓名:狗,, 年龄:11岁, getName:函数{ 提醒这个名字; } }*/ 函数名、年龄{ this.name=名称; 这个。年龄=年龄; } Dog.prototype.getName=函数{ console.log this.name; } var d1=新的DogRex,8; d1.getName;//Rex你的狗只是一个简单的对象文字, 这意味着您的getName绑定到它,而不是您的Dog类

您可以将该函数改为Dog方法:

/*变量狗={ 姓名:狗,, 年龄:11岁, getName:函数{ 提醒这个名字; } }*/ 函数名、年龄{ this.name=名称; 这个。年龄=年龄; } Dog.prototype.getName=函数{ console.log this.name; } var d1=新的DogRex,8;
d1.getName;//JavaScript中的Rex传统OO

function Dog(name, age) {
    this.name = name || "Dog";// if the name is not given, it defaults to "Dog"
    this.age = age || "11"; 
}

Dog.prototype.getName =  function() {
    alert(this.name); 
}

var d1 = new Dog("Rex", 8);
d1.getName();
function createDog(name, age) {
    // create a new dog and return it
    var dog = {
        name: name || "Dog",// if the name is not given, it defaults to "Dog"
        age: age || "11"
    };
    return dog;
}

createDog.getName =  function(dog) {
    // explicit dog as 1st parameter
    alert(dog.name); 
}

//createDog is a normal function that returns something, no "new" needed
var d1 = createDog("Rex", 8);
createDog.getName(d1);
JavaScript中更显式的OO

function Dog(name, age) {
    this.name = name || "Dog";// if the name is not given, it defaults to "Dog"
    this.age = age || "11"; 
}

Dog.prototype.getName =  function() {
    alert(this.name); 
}

var d1 = new Dog("Rex", 8);
d1.getName();
function createDog(name, age) {
    // create a new dog and return it
    var dog = {
        name: name || "Dog",// if the name is not given, it defaults to "Dog"
        age: age || "11"
    };
    return dog;
}

createDog.getName =  function(dog) {
    // explicit dog as 1st parameter
    alert(dog.name); 
}

//createDog is a normal function that returns something, no "new" needed
var d1 = createDog("Rex", 8);
createDog.getName(d1);

JavaScript中的传统OO

function Dog(name, age) {
    this.name = name || "Dog";// if the name is not given, it defaults to "Dog"
    this.age = age || "11"; 
}

Dog.prototype.getName =  function() {
    alert(this.name); 
}

var d1 = new Dog("Rex", 8);
d1.getName();
function createDog(name, age) {
    // create a new dog and return it
    var dog = {
        name: name || "Dog",// if the name is not given, it defaults to "Dog"
        age: age || "11"
    };
    return dog;
}

createDog.getName =  function(dog) {
    // explicit dog as 1st parameter
    alert(dog.name); 
}

//createDog is a normal function that returns something, no "new" needed
var d1 = createDog("Rex", 8);
createDog.getName(d1);
JavaScript中更显式的OO

function Dog(name, age) {
    this.name = name || "Dog";// if the name is not given, it defaults to "Dog"
    this.age = age || "11"; 
}

Dog.prototype.getName =  function() {
    alert(this.name); 
}

var d1 = new Dog("Rex", 8);
d1.getName();
function createDog(name, age) {
    // create a new dog and return it
    var dog = {
        name: name || "Dog",// if the name is not given, it defaults to "Dog"
        age: age || "11"
    };
    return dog;
}

createDog.getName =  function(dog) {
    // explicit dog as 1st parameter
    alert(dog.name); 
}

//createDog is a normal function that returns something, no "new" needed
var d1 = createDog("Rex", 8);
createDog.getName(d1);
您可以将类与syntaxic sugar一起使用,以便在ES6中正确创建对象。 在您的示例中,可以这样写:

'use strict';
class Dog{
  constructor(name, age){
    this.name = name;
    this.age = age;
  }
  getName(){
    console.log(this.name);
  }
}

let doggy = new Dog("krypto", 125);
doggy.getName();
您可以将类与syntaxic sugar一起使用,以便在ES6中正确创建对象。 在您的示例中,可以这样写:

'use strict';
class Dog{
  constructor(name, age){
    this.name = name;
    this.age = age;
  }
  getName(){
    console.log(this.name);
  }
}

let doggy = new Dog("krypto", 125);
doggy.getName();


为什么希望d1有一个getName函数?您声明并分配给变量dog的对象与从函数dog.dog创建的实例完全无关。dog不会成为dog的原型miraculously@Ponty好的,应该是怎样的,我不知道你想要达到什么。问题是Dog实例没有.getName方法。你可以在构造器中添加一个,也可以在Dog原型中添加一个。我建议你读一读教程,比如或者为什么你希望d1有一个getName函数?您声明并分配给变量dog的对象与从函数dog.dog创建的实例完全无关。dog不会成为dog的原型miraculously@Ponty好的,应该是怎样的,我不知道你想要达到什么。问题是Dog实例没有.getName方法。您可以在构造函数中添加一个,也可以在Dog原型中添加一个。我建议您阅读一本教程,例如,我不应该在{}和use.prototype中包含方法。相反?那么我应该如何声明字段呢?@geogej看到我的第二个示例了吗?正如我从第一个示例中了解到的,我只能使用构造函数声明字段,对吗?为什么要用设置从示例中删除设置?所以我不应该在{}和use.prototype中包含方法。相反?那么我应该如何声明字段呢?@geogej看我的第二个示例正如我从第一个示例中了解到的,我只能使用构造函数来声明字段,对吗?为什么要用设置从示例中删除设置?即,我应该通过构造函数声明类的字段?在JavaScript中,对象就像动态结构,您可以在运行时添加和更改字段。一般来说,在构造函数中声明它们是一个好主意,但这取决于您想做什么。我应该通过构造函数声明类的字段?在JavaScript中,对象类似于动态结构,您可以在运行时添加和更改字段。一般来说,在构造函数中声明它们是一个好主意,但这取决于您想做什么。谢谢,但恐怕不是所有人都使用最新的浏览器,所以最好使用老式语法来澄清这个问题。谢谢,但恐怕不是所有人都使用最新的浏览器,所以最好使用老式语法来澄清这个问题。