JavaScript OOP: Uncaught TypeError: is not a function

JavaScript OOP: Uncaught TypeError: is not a function

创建对象时遇到问题。控制台说最后一行有问题。请告诉我它应该如何,我更熟悉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();

你的dog只是一个简单的对象文字,
这意味着你的 getName 绑定到它,而不是你的 Dog class.

您可以将该函数设为 Dogmethod

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

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

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

var d1 = new Dog("Rex", 8);
d1.getName(); // "Rex"

这是一个使用您的 settings "defaults"

的变体

function Dog() {
  this.name = "Dog"; // Default name
  this.age = 11;     // Default age
}

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

var d1 = new Dog();
d1.name = "Rex";    // Override default name
d1.getName(); // "Rex"

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();

JavaScript

中更明确的 OO
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);

您可以使用 class 和语法糖来在 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();