//构造函数
function Person(name, age) {
//实例属性
this.name = name;
this.age = age;
//实例方法
this.speak = function() {
return "会说话";
}
}
var person1 = new Person("张三", 15);
var person2 = new Person("张三", 35);
//比较的是值
console.log(person1.name == person2.name);
//比较的是地址
console.log(person1.speak == person2.speak);
//构造函数的缺点 没实例化一个对象,那么会在 构造函数中的实例化 将开辟一次空间 会造成内存或者空间的浪费
//解决措施 使用原型 prototype
function Dog () {}//创建一个构造函数
//原型属性
Dog.prototype.name = "big";
Dog.prototype.age = 5;
//原型方法
Dog.prototype.bark = function () {
return "汪汪";
}
Dog.prototype.wag = function () {
return "摇尾巴";
}
//原型无法传参 所以实例化出来的对象都具有相同的属性值
var dog1 = new Dog();
var dog2 = new Dog();
console.log(dog1.name == dog2.name);
console.log(dog1.wag== dog2.wag);
//混合型
//属性定义成实例属性
//方法定义成原型方法
function Cat (name,age) {
//实例属性
this.name = name;
this.age = age;
}
//原型方法
Cat.prototype = {
drag : function() {
return "抓老鼠";
},
eat : function() {
return "吃鱼";
}
}
var cat = new Cat("加菲猫", 3);
console.log(cat.name);
console.log(cat.eat());
继承
实例方法实例属性继承
function Person(name, age) {
this.name = name;
this.age = age;
this.eat = function() {
return "吃货";
}
}
//call() 伪装继承
function Man(name, age, sex) {
Person.call(this, name, age);
//Person.apply(this, [name, age]);
this.sex = sex;
}
// call() apply() 都是伪装继承 都只能继承实例属性和实例方法
//第一个参数都是当前子对象
//call(); 父对象有几个参数,后面传几个参数
//apply(); 父对象的参数以数组的方式传入
var man = new Man("张三", "15", "男");
console.log(man.name);
console.log(man.age);
console.log(man.sex);
原型继承或原型链继承
function Dog () {};
//原型属性
Dog.prototype.name = "xxx";
Dog.prototype.age = 3;
//原型方法
Dog.prototype.eat = function() {
return "吃肉";
}
function JinMao () {};
for(var i in Dog.prototype) {
JinMao.prototype[i] = Dog.prototype[i];
}
var jinMao = new JinMao("小优", 3,);
console.log(jinMao.name);
console.log(jinMao.eat());
混合继承
function Dog (name, age) {
//实例属性
this.name = name;
this.age = age;
};
//原型方法
Dog.prototype.eat = function() {
return "吃肉";
}
//子构造函数
function JinMao (name, age) {
Dog.call(this, name, age);
};
for(var i in Dog.prototype) {
JinMao.prototype[i] = Dog.prototype[i];
}
//实例化一个对象
var jinMao = new JinMao("小优", 3,);
console.log(jinMao.name);
console.log(jinMao.eat());
欢迎分享本文,转载请保留出处:前端ABC » JavaScript 面向对象
前端ABC