前言:js在面向对象的写法有很多种,继承方式也有很多种。本篇的写法“我个人”认为比较好用,也比较简单的写法。
一、创建构造函数,并创建一个实例
function Person(name,age){
this.name = name;
this.age = age;
};
Person.prototype.sayName = function(){
console.log('name: '+this.name);
};
var nick = new Person('nick',18);
nick.sayName();
执行Person的实例nick.sayName方法,成功输出name: nick
二、继承写法
①、错误的继承示范
function Person(name,age){
this.name = name;
this.age = age;
};
Person.prototype.sayName = function(){
console.log('name: '+this.name);};
function Person2(name, age, sex){ //创建Person2
Person.call(this,name,age); //继承属性
this.sex = sex;
}
Person2.prototype = Person.prototype; //继承方法
Person2.prototype.sayName = function(){ //修改sayName方法
console.log('my name is '+ this.name);
}
Person2.prototype.saySex = function(){ //添加saySex方法
console.log( this.sex );
}
console.log(Person.prototype); //输出Person.prototype对象
var nick = new Person('nick',18);
nick.sayName();
var freddy = new Person2('freddy',20,'男');
freddy.sayName();
freddy.saySex();
输出结果:
运行代码会发现:Person.prototype对象已经被修改,我们创建的Person的实例nick的shaName(); 输出my name is nick。这是很危险的操作,这样会影响之前程序的运行。
②、正确的继承示范
function Person(name,age){
this.name = name;
this.age = age;
};
Person.prototype.sayName = function(){
console.log(this.name);
};
function Person2(name, age, sex){
Person.call(this,name,age);
this.sex = sex;
}
for(var i in Person.prototype){ //正确的继承方法
Person2.prototype = Person.prototype[i];
}
Person2.prototype.sayName = function(){
console.log('my name is '+ this.name);
}
Person2.prototype.saySex = function(){
console.log( this.sex );
}
console.log(Person.prototype);
var nick = new Person('nick',18);
nick.sayName();
var freddy = new Person2('freddy',20,'男');
freddy.sayName();
freddy.saySex();
运行结果:
运行代码:我们添加或修改继承的方法,就不会再影响Person,prototype的方法了。
相关链接: 【ES6】“面向对象写法”和继承方式