JS

1、面向对象的概念
从编程思想角度解释:
面向过程的编程思想,关注的是解决问题的步骤,
面向对象的编程思想,关注的是解决问题需要的对象。
面向对象的编程思想继承于面向过程。
从编程语言的角度解释:
面向对象的编程语言,必须有‘类’和‘对象’这两个概念,并且对象是经由类创建出来的;还需要有‘继承’,‘封装’,‘多态’三个特征。
js语言不符合以上条件,但是有‘对象’的概念,所以他是一门基于对象的编程语言。
js和面向对象的关系:利用面向对象的编程思想来指导js代码的书写方式。
2、使用js创建对象的方法
1)字面量创建对象
优势:快捷、直观、方便
劣势:需要创建多个对象时,代码冗余

 var per = {
                name: 'xiaoWang',
                age: 23,

                sayHi: function () {
                    alert('hello');
                }
            };
            //  访问对象的属性:
            //  1.对象名+'.'+属性名
            //  2.对象名+[]+属性名字符串
            alert(per['name']);
            per.sayHi()

2)工厂方法创建对象
工厂模式:通过调用工厂,给工厂传递参数,则工厂就能批量生产对应的产品
优势:解决了代码冗余的问题
劣势:无法区分该对象的类型(如:系统类型,如number是Number()创建的,但是自定义类型无法获取到)

//  定义创建对象的工厂
        function creatPerson(name, age) {
            // 1.创建空对象
            var per = {};
            // 2.给空对象添加属性和方法
            per.name = name;
            per.age = age;
            per.sayHi = function () {
                alert(name +'hello')
            }
            // 把创建的对象返回出去
            return per;
        }

        var per1 = creatPerson('xiaoWang', 23);
        console.log(per1);
        // per1.sayHi();
        console.log(per1 instanceof creatPerson);

        var num = new Number();
        //  可以通过instanceof方法判断实例的类型
        console.log(num instanceof Number);
        var num1 = 23;
        console.log(num1 instanceof Number);

        var per2 = creatPerson('xiaoXuan', 18);
        console.log(per2);
        per2.sayHi();

3)构造函数创建对象
优势:解决了获取对象类型的问题,使用构造函数创建的对象自带一个
constructor,通过该属性获取对象的类型(还可以使用instanceof检测对
象是那个类型的实例:(personinstanceof Person),返回1个布尔值 )
劣势:内存占用有点大

    //  构造函数函数名首字母大写
            function CreatePreson(name, age) {
                // 把所有的属性和方法挂载在this指针上。将来this指向谁,这些属性和方法就添加在谁身上
                this.name = name;
                this.age = age;

                this.sayHi = function () {
                    alert(this.name + 'hello');
                };
            }

            //  调用构造函数创建对象
            //  new + 构造函数名
            //  new:通过new关键字调用的函数,new会首先在内存中开辟一块存储空间,然后把构造函数中的this指针指向这块存储空间,这样给this指针绑定的属性、方法,也就添加进了这块存储空间中。最后把存储空间的地址给per对象保存
            //  通过构造函数创建出来的对象可以借助相关方法判断归属关系。
            var per1 = new CreatePreson('xiaoXuan', 18);
            var per2 = new CreatePreson('xiaoWang', 23);
            per1.sayHi();
            console.log(per1 instanceof CreatePreson);//true

            console.log(per1.sayHi == per2.sayHi);//false

工厂模式和构造函数创建对象的区别:
1)构造函数没有显示的创建新对象
2)直接把属性和方法赋值给了this指针
3)构造函数没有return语句
4)使用构造函数穿建出来的对象可以标示这个对象属于哪一种类型
普通函数调用和构造函数调用的区别:
1)构造函数必须使用new操作符来创建新对象,如果像调用普通函数那样创建对象,就是在全局作用域中调用函数了,this指针会指向window对象。
3、如何使用对象
1)访问对象属性的两种方法:点语法和[]访问某一个属性
使用点语法访问属性,点后直接跟属性名
使[]访问属性,[]里是属性字符串(必须是字符串类型的数据)或保存
属性名字符串的变量
使用for...in...遍历对象的所有属性
for (var property in per1) {
console.log(property
+"="+ per1[property]);
}
3、继承
通过一个类(父类、父构造函数)创建出另一个类(子类、子构造函数),这样新创建出来的类不仅拥有了原有类的属性、方法、子类,而且也可以添加自己独有的属性、方法,子类也可以重写父类的方法。
1)通过call实现继承(借用构造函数实现继承)

function ClassA(name) {
this.name = name;
this.sayHi = function () {
alert("hello");
}
}
function ClassB(name) {
// call函数是Function下的1个方法,第1个参数表示要修改原函数中this指针的指向,第2个参数起,依次代表父构造器所需要的参数
ClassA.call(this, name);
// 添加新新法
this.sayBye = function () {
alert("bye-bye");
}
}
var cB = new ClassB("zhangsan");
cB.sayHi();

2)原型链实现继承

function Parent(name) {
this.name = name;
this.say = function () {
alert("hello");
}
}
function Child(age) {
this.age = age;
}
// 通过子类的原型指针,从父类继承相关的属性、⽅法:让子类的原型指针指向父类对象
Child.prototype = new Parent(‘张三’);
// 因为prototype中还包含1个constructor属性,这个属性用来指向prototype所在的构造函数,所以要把constructor指向的构造函数改回Child,保
证从该函数创建出的对象的constructor属性不会指向Parent
Child.prototype.constructor = Child;
var child = new Child(23);
alert(child.age);
child.say();

3)组合方式实现继承
实例属性使用CALL的方式继承,原型方法使用原型链方式继承

// 使用call/apply实现对实例属性的继承
        // 使用原型实现对原型芳法的继承
            function CreateAnimal(name, age) {
                this.name = name;
                this.age = age;
            }

            CreateAnimal.prototype.sayHi = function () {
                alert('hello');
            }


            function CreatePerson(name, age, gender) {
                CreateAnimal.call(this, name, age);
                this.gender = gender;
            }


            CreatePerson.prototype = new CreateAnimal();
            CreatePerson.prototype.constructor = CreatePerson;
            CreatePerson.prototype.eatFoot = function () {
                alert('吃饭了');
            }


            var per = new CreatePerson('zhengSAN', 18, 'MAN');
            // console.log(per.gender);
            per.sayHi();
            per.eatFoot();

4)通过冒充调用方式实现继承

// 父类
function ClassA(sColor) {
this.color = sColor;
this.show = function () {
alert(this.color);
}
}
var cA = new ClassA("red");
cA.show();
// 子类
function ClassB(sColor,age) {
// 通过冒充实现子类继承父类的方法、属性
this.newFn = ClassA; // 给this添加1个新的函数,也就是ClassA这个构造函数
this.newFn(sColor); // 执⾏新添加进去的函数,通过this.newFn调⽤ClassA,进⽽修改了ClassA中this指针的指向
delete this.newFn; // 修改完指针的指向后,就可以把新添加的这个⽅法删掉(过河拆桥)
// 继续添加新属性\方法
this.age = age;
}
var cB = new ClassB("green", 23);
cB.show();
console.log(cB.age);

4、百度模板的使用

            <!--定义模板 -->
        <script id='news' type="text/template">
            <!--<% %>:是百度模板的语法,如果需要在模板中植入逻辑代码,就需要使用这个符号包裹 -->
            <h1> <%=title%> </h1>
            <h3> <%=des%> </h3>
        </script>

    </body>
    <script type="text/javascript">
        //  调用模板
        var data = {
            title: "http://www.baidu.com",
            des: "今天距离放假已不足二十四小时,好开心!!!"
        }
        var html0 = baidu.template('news', data);
        console.log(html0);
        // 把代码拼接进文档流
        document.body.innerHTML = html0;
        // document.appendChild(html0);
    </script>

5、鼠标拖拽相关属性
window.onload = function () {
var div = document.querySelector('#div');
div.onclick = function (ev) {
// clientX\clientY坐标系原点是浏览器的左上角
// offsetX\offsetY坐标系原点是标签border以内的左上角
var e = ev || event;
// offsetLeft/offetTop:从html标签的左侧边框和顶部边框开始计算距离
// offsetWidth/offsetHeight包含了:边框、内边距、width/height
// console.log(div.offsetWidth);
console.log(ev);
}
}
鼠标拖拽相关事件

        <style media="screen">
            body {
                height: 2000px;
            }
            #div {
                width: 100px;
                height: 100px;
                background-color: hotpink;
                position: absolute;
            }
        </style>

        <script type="text/javascript">
            window.onload = function () {
                var div = document.querySelector('#div');

                //  1、给标签添加鼠标按下
                div.onmousedown = function (ev) {
                    var e = ev || event;

                    // 获取到鼠标坐标距离标签左侧和顶部的间隔
                    // 用鼠标移动后的位置-第一次点击时的位置,得出鼠标偏移的位置
                    // 把偏移的位置增加给div标签
                    var left = e.offsetX;
                    var top = e.offsetY;


                    document.onmousemove = function (ev) {
                        var e = ev || event;
                        console.log(e.offsetX);
                        var offsetLeft = e.pageX - div.offsetLeft - left;
                        var offsetTop = e.pageY - div.offsetTop - top;

                        div.style.left = div.offsetLeft + offsetLeft + 'px';
                        div.style.top = div.offsetTop + offsetTop + 'px';
                    }

                    div.onmouseup = function () {
                        //  把绑定在标签中的事件清理掉
                        document.onmousemove = null;
                        // this.onmousedown = null;
                        this.onmouseup = null;
                    }
                }
            }
        </script>
    </head>
    <body>

        <div id="div">

        </div>

    </body>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容

  • 1,javascript 基础知识 Array对象 Array对象属性 Arrray对象方法 Date对象 Dat...
    Yuann阅读 896评论 0 1
  • 继承 一、混入式继承 二、原型继承 利用原型中的成员可以被和其相关的对象共享这一特性,可以实现继承,这种实现继承的...
    magic_pill阅读 1,054评论 0 3
  • 1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined、Nul...
    极乐君阅读 5,502评论 0 106
  • 你是谁? 你好,我是时间。 你好,我是了挽。 我们是不是早就认识了呀? 对呀,对呀,你一直在我身边。 原来你已经都...
    青果果说阅读 285评论 12 7
  • 写在前面:因单位的“作业”,写了这篇文章。 亲爱的老妈: 你好,看着你瘦瘦的身体,总有一些感概。 小时...
    城沧凝阅读 629评论 8 10