JavaScript面向对象编程学习笔记

js和其他语言不同,没有class的概念,要想形成面向对象,就必须依靠他自身一个非常重要的概念,也是不好理解的一个东西。那就是原型prototype,使用他可以模拟继承和类的实现。下面先看一个简单的例子:

function Person (name) {
            this.name = name;
        }
 Person.prototype = {
            getName:function  () {
                return this.name;
            }
        }
        var zhang = new Person("zhangsan");
        console.log(zhang.getName());
        运行结果:zhangsan

有两种继承方式,原型式继承,构造函数式继承
原型链继承,看下面这个例子:

function Child () {
            this.age = 12;
        }
 function Parent () {
            this.name = 'mike';
        }
        Child.prototype = new Parent();//child继承Parent,通过原型,形成链条
        var test  = new Child();
        console.log(test.age);
        console.log(test.name);

两个函数用prototype形成链条,形成了继承。
下面看看这个原型式继承

function obj (o) {
            function F () {};
            F.protype = o;
            return new F();
        }
var box = {
            name:'trigkit4',
            arr:['brother','sister','baba'];
        };
        var b1 = obj(box);
        console.log(b1.name);
        b1.name = 'mike';
        console.log(b1.name);
        console.log(b1.arr);
        b1.arr.push('parents');
        console.log(b1.arr);
        var b2 = obj(box);
        console.log(b2.name);
        console.log(b2.arr);


//原型式继承首先在obj()函数内部创建一个临时性的构造函数,然后将传入的对象作为这个构造函数的原型,最后返回这个临时类型的一个新实例
//寄生组合式继承
        function obj (o) {
            function F () {};
            F.prototype = o;
            return new F();
        }
        function create (parent,test) {
            var f = obj(parent.prototype);//创建对象
            f.constructor = test;//增强对象
        }
        function Parent (name) {
            this.name = name;
            this.arr = ['brother','sister','parents'];
        }
        Parent.prototype.run = function  () {
            return this.name;
        };
        function Child (name,age) {
            Parent.call(this,name);
            this.age = age;
        }
        inheritPrototype(Parent,child);//通过这里实现继承
        var test = new Child('trigkit4',21);
        test.arr.push('nephew');
        console.log(test.arr);
        console.log(test.run());//只共享了方法
        var test2 = new Child('jack',22);
        console.log(test2.arr);//引用问题解决

依靠原型式的继承,中用new 操作符产生的对象,会向上查找,查找他原型链上的属性,这样就实现了继承,如果删除本对象上的属性,是不会影响到父类型属性的。
对象把函数当作方法的时候,this指向的就是那个对象。

作用域

1.全局作用域
2.函数作用域
3.evel作用域
我在学习js继承的时候,看了好多资料,但是发现根本记不住,我只有把其中的几个理解下来,在图后面更多的。现在我先缕一缕:要面向对象,那得先有对象,对象可以通过工厂模式还有构造函数模式等产生出来,也可以通过原型模式产生,有了对象之后就可以实现面向对象的重要特性,继承,这里我只掌握的原型模式的继承,就比如我上面举的例子,每个对象都有一个prototype我把他指向另外一个函数,这样就实现了从这个函数到那个函数的继承,因为每个对象都是Object的实例,所有每个对象都有tostring和valueof这些方法。
说的如果有不对的,恳请大家指正、

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值