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