天天看点

js实现oop面向对象

应用文章原文链接:

https://www.jianshu.com/p/f9792fdd9915

以下为整理后可运行成功的示例代码,记录一下

//-------------------------------oop示例代码   开始

/*
    javascript规定,
    每一个构造函数都有一个prototype属性,指向另一个对象。
    这个对象的所有属性和方法,都会被构造函数的实例继承。
    这意味着,我们可以把那些不变的属性和方法,直接定义在prototype对象上。
    __proto__是原型链,指向实例化的函数原型。
 */

//人类
function Person(name,age){
    this.name = name;
    this.age = age;
}
Person.prototype.run = function(){
    console.log('跑路~')
};
Person.prototype.say = function(){
    console.log('说话~')
};
console.log("Person的方法"+Person.prototype);
let person=new Person("张三",17);
console.log("person:"+person);
//男人
function Man(name,sex,age){
    Person.call(this,name,age);
    this.sex = sex;
}
/*
    由于:
    Man.prototype = Person.prototype;
    Man.prototype.yyy = function(){
        console.log('嘤嘤嘤');
    }
    这样的写法,因为复杂对象的赋值操作是引用而不是赋值,
    所以会发现Person的prototype也改变了,不能这样使用,
    【要在循环中进行赋值,来实现继承属性】
 */
// for(var key in Person.prototype){
//     Man.prototype[key] = Person.prototype[key];
//     console.log(key)
// }
//Man.prototype.constructor=Person.prototype.constructor;//发现构造不能赋值?==>需要用中介+call
//所以要用更优的解决方案:【中继】来做准备工作
function Ready(){}//
Ready.prototype = Person.prototype;//引用
Man.prototype = new Ready();//new 返回了一个新对象 __proto__指向被实例化的构造函数的prototype
Man.prototype.constructor = Man;
console.log(Man.prototype);

Man.prototype.yyy = function(){
    console.log('嘤嘤嘤');
}
//.propertype是对象的内部方法,不能用JSON.stringify()查看其输出结果,只能debug看
console.log("Man的方法:"+Man.prototype);
console.log("被Man继承后的Person的方法:"+Person.prototype);
//通过new 关键字创建对象的实例
var xm = new Man("小明","女",18);
xm.yyy();
console.log(xm);
console.log(xm.sex);
console.log(xm.name);

//-------------------------------oop示例代码   结束

           
js实现oop面向对象