JavaScript 面向对象

//构造函数
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 面向对象

赞 (2)
分享到:更多 ()

发表评论 0