zoukankan      html  css  js  c++  java
  • javascript 面向对象--理解

    一般我们的原型写法都是

         var Father = function () {
               this.speed= 90;
            };
            Father.prototype.move = function (speed) {
                console.log("原型"+speed);
            };
            Father.prototype.start = function () {
                console.log(this.speed);
            };
            var father = new Father();
            father.start();//90

    如果我们要在start里面调用move这个方法

    直接用this指针就行了

    var Father = function () {
               this.speed = 90;
            };
            Father.prototype.move = function (speed) {
                console.log("原型"+speed);
            };
            Father.prototype.start = function () {
                //console.log(this.speed);
                this.move(this.speed);
            };
            var father = new Father();
            father.start();//原型90

    如果我们在start里面再写一个function,看下怎样

    var Father = function () {
               this.speed = 90;
            };
            Father.prototype.move = function (index) {
                console.log("原型"+index);
            };
            Father.prototype.start = function () {
                //console.log(this.name);
                //this.move(this.speed);
                setInterval(function () {
                    this.move(this.speed);
             },
    2000); }; var father = new Father(); father.start();//error

    出现错误,会提示不存在move属性或方法,为什么呢

     初步认为是setInterval里面的匿名函数,指针this没有指向外面的move,再修改一下

    var Father = function () {
               this.speed = 90;
            };
            Father.prototype.move = function (index) {
                console.log("原型"+index);
            };
            Father.prototype.start = function () {
                //console.log(this.name);
                //this.move(this.speed);
                setInterval(function (self) {
                    self.move(self.speed);
                    self.speed++;
                }, 2000,this);
                //setInterval(function () { }, 2000);
            };
            var father = new Father();
            father.start();//在chrome下正常运行,但是在IE下就不行了

     我们把this指针传进去

    var Father = function () {
            this.speed = 90;
            return Father.prototype;
        };
            Father.prototype.speed = 100;
            Father.prototype.move = function (speed) {
                console.log("原型" + speed);
            };
           
            Father.prototype.start = function () {
                //console.log(this.name);
                //this.move(this.speed);
                //setInterval(function () {
                //self.move(self.speed);
                //this.move(this.speed);
                //self.speed++;
                //return this;
                //}, 2000);
                //setInterval(function () { }, 2000);
                //(function adds(self) {
                    //console.log("ddd");
                    //self.move("ddddddd");
                //})(this);
    
                //function adddd(self) {
                   // self.move("hh");
                //};
                //adddd(this);
                var self = this;
                setInterval(function () {
                    self.move("ddddddddddddddddddddddddddd");
                }, 2000);
            };
            var father = new Father();
            father.start();//原型

    搞掂

     一直都想支持原型写法,但是一直没实施,现在开始多点用原型去实现自己想要的功能

    var Father = function () {
                this.speed = 90; 
                this.timer = null;
                //return Father.prototype;
            };
            Father.prototype.move = function (speed) {
                console.log("原型" + speed);
            };
            Father.prototype.start = function () {
                var self = this;
                self.timer = setInterval(function () {
                    self.move(self.speed);
                    self.speed++;
                }, 2000);
            };
            Father.prototype.stop = function () {
                clearInterval(this.timer);
            };
            var father = new Father();
            father.start(); //原型
            setTimeout(function () {
                father.stop();
            }, 5000);
            setTimeout(function () {
                father.start();
            }, 5000);

    分割线

    同样具有一样功能的 “工厂模式” 实现方法

     function Father() {
                var o = new Object();
                o.speed = 10;
                o.timer = null;
                o.move = function (speed) {
                    console.log(speed);
                };
                o.start = function () {
                    var self = this;
                    self.timer = setInterval(function () {
                        self.move(self.speed);
                        self.speed++;
                    }, 2000);
                };
                o.stop = function () {
                    clearInterval(this.timer);
                };
                return o;
            }
            var father = new Father();
            father.start();
            setTimeout(function () {
                father.stop();
            }, 5000);  //5秒后关闭

    分割线

     构造函数实现方式

     function Father() {
                this.speed = 90;
                this.timer = null;
                this.move = function (speed) {
                    console.log(speed);
                };
                this.start = function () {
                    var self = this;
                    this.timer = setInterval(function () {
                        self.move(self.speed);
                    }, 2000);
                };
                this.stop = function () {
                    clearInterval(this.timer);
                };
            }
            var father = new Father();
            father.start();
  • 相关阅读:
    POJ3613 k边最短路
    洛谷4014最大/小费用最大流
    POJ1734无向图求最小环
    洛谷4013数字梯形
    洛谷4147玉蟾宫
    洛谷4145上帝造题的七分钟2
    洛谷4092 树
    Nginx动静分离-tomcat
    nginx之Geoip读取地域信息模块
    Nginx与Lua开发
  • 原文地址:https://www.cnblogs.com/lihaozhou/p/3645255.html
Copyright © 2011-2022 走看看