如何以OOP风格模拟JavaScript中的构造函数?

如何以OOP风格模拟JavaScript中的构造函数?,javascript,oop,Javascript,Oop,以面向对象的方式,我定义了一个人“类”,如下所示: var Person = { name: '', age: 32, gender: 'male', interests: ['music', 'skiing'], bio: function() { alert(this.name[0] + ' ' + this.name[1] + ' is ' + this.age + ' years old. He likes ' + this.interests[0] + '

以面向对象的方式,我定义了一个人“类”,如下所示:

var Person = {
  name: '',
  age: 32,
  gender: 'male',
  interests: ['music', 'skiing'],
  bio: function() {
    alert(this.name[0] + ' ' + this.name[1] + ' is ' + this.age + ' years old. He likes ' + this.interests[0] + ' and ' + this.interests[1] + '.');
  },
  greeting: function() {
    alert('Hi! I\'m ' + this.name + '.');
  }
};
现在,我正在实例化上面的类

var person1= Object.create(Person);
person1.name = 'personname';
person1.greeting();

如何模拟构造函数,以便在Object.create(Person)创建新对象时,自动计算构造函数代码?

您可以将代码封装在函数中,并在那里调用它。将与
原型建立关系,但不会自动调用任何其他代码

function person(name) {
  var person1 = Object.create(Person);
  person1.name = name;
  return person1;
}

person('personname').greeting();

您还应该避免将变量的第一个字母大写,除非它们是应该使用
new
调用的函数。这是一种仅用于构造函数的命名约定。

您可以将代码封装在函数中,并在那里调用它。将与
原型建立关系,但不会自动调用任何其他代码

function person(name) {
  var person1 = Object.create(Person);
  person1.name = name;
  return person1;
}

person('personname').greeting();
您还应该避免将变量的第一个字母大写,除非它们是应该使用
new
调用的函数。这是一种仅用于构造函数的命名约定。

var Person=函数(名称){
this.name=名称| |“”;
年龄=32岁;
这个。性别=‘男性’;
this.interests=[“音乐”、“滑雪”];
this.bio=函数(){
警惕(this.name[0]+'+this.name[1]+'是'+this.age+'岁。他喜欢'+this.interests[0]+'和'+this.interests[1]+');
};
this.greeting=函数(){
警报('Hi!我是'+this.name+');
};
};
var person1=新人(“人名”);
人1.问候语()
var Person=函数(名称){
this.name=名称| |“”;
年龄=32岁;
这个。性别=‘男性’;
this.interests=[“音乐”、“滑雪”];
this.bio=函数(){
警惕(this.name[0]+'+this.name[1]+'是'+this.age+'岁。他喜欢'+this.interests[0]+'和'+this.interests[1]+');
};
this.greeting=函数(){
警报('Hi!我是'+this.name+');
};
};
var person1=新人(“人名”);

人1.问候语()
您可以创建一个真正的类,用于
new

var Person=函数(){
var Person=函数(){
this.name=['',];
年龄=32岁;
这个。性别=‘男性’;
this.interests=[“音乐”、“滑雪”];
};
Person.prototype.bio=函数(){
返回此.name[0]+'+this.name[1]+'是'+this.age+'岁。他喜欢'+this.interests[0]+'和'+this.interests[1]+';
};
Person.prototype.greeting=函数(){
返回“嗨!我是”+this.name+”;
};
返回人;
}();
风险值p1=新员工;
p1.name=['Tom','Sawyer'];
console.log(p1.bio());

控制台日志(p1)
您可以创建一个真正的类,用于
new

var Person=函数(){
var Person=函数(){
this.name=['',];
年龄=32岁;
这个。性别=‘男性’;
this.interests=[“音乐”、“滑雪”];
};
Person.prototype.bio=函数(){
返回此.name[0]+'+this.name[1]+'是'+this.age+'岁。他喜欢'+this.interests[0]+'和'+this.interests[1]+';
};
Person.prototype.greeting=函数(){
返回“嗨!我是”+this.name+”;
};
返回人;
}();
风险值p1=新员工;
p1.name=['Tom','Sawyer'];
console.log(p1.bio());


控制台日志(p1)你不能。为什么不使用构造器呢?另外,
Person
是一个对象,而不是一个类可能是一个输入错误,但是在您的示例中没有定义
animal
。您想做什么?你为什么要模仿已经存在的东西?为什么不使用现有的机制,而是围绕它们工作,并询问如何模仿它们?这样做的目的是什么,你的意图/理由/想法是什么?@Thomas避免使用关键字
new
this
,构造函数是来自Douglas Crockford的JavaScript中的常见样式。他写了一些很受欢迎的书,并且在ECMAScript的董事会工作,所以我可以看到他们是怎么想这样做的。你不能。为什么不使用构造器呢?另外,
Person
是一个对象,而不是一个类可能是一个输入错误,但是在您的示例中没有定义
animal
。您想做什么?你为什么要模仿已经存在的东西?为什么不使用现有的机制,而是围绕它们工作,并询问如何模仿它们?这样做的目的是什么,你的意图/理由/想法是什么?@Thomas避免使用关键字
new
this
,构造函数是来自Douglas Crockford的JavaScript中的常见样式。他写了一些很受欢迎的书,并且在ECMAScript的董事会工作,所以我可以看到他们是如何想这样做的。所以所有的作业,例如this.name,this.age,this.gender,this.interests都相当于构造函数代码。是吗?@user734861正确。这就是JS中定义构造函数的方式。ES6有一个更优雅的OOP语法。@user734861这是一个构造函数我对这个问题的解释是他们想“模拟”一个构造函数。意思是新的
是禁止的。这并不是模仿构造函数;这是一个构造函数,它不像原始代码那样使用它的原型和
对象。create
会。因此所有赋值,例如this.name、this.age、this.gender、this.interest,都等同于构造函数代码。是吗?@user734861正确。这就是JS中定义构造函数的方式。ES6有一个更优雅的OOP语法。@user734861这是一个构造函数我对这个问题的解释是他们想“模拟”一个构造函数。意思是新的
是禁止的。这并不是模仿构造函数;这是一个构造函数,它不像使用
对象的原始代码那样使用它的原型。