Js面向对象整理(一)

举报
rockyyee 发表于 2020/07/05 15:40:14 2020/07/05
【摘要】 本篇记录个人所学Js面向对象整理(一),知识点涉及工厂模式、new运算符、构造函数、原型prototype...

Js面向对象整理(一)


工厂模式

优点&缺陷


工厂模式解决了代码复用的问题,


1.但是却没有解决对象识别的问题。即创建的所有实例都是Object类型。(不清楚是哪个对象的实例)


2.没有原型,占用内存。


更好的方式?



function person(option) {

    let obj = {};

    obj.name = option.name;
    obj.age = option.age;
    obj.canDo = function() {
        console.log("I can do everything!");
        // console.log(this);
    }

    return obj;
}

let rocky = person({
    name: "Rocky",
    age: 24
});
console.log(rocky); //  {name: "Rocky", age: 24, canDo: ƒ}
rocky.canDo();  //  I can do everything!

let sunny = person({
    name: 'Sunny',
    age: 18
});
console.log(sunny); //  {name: "Sunny", age: 18, canDo: ƒ}
sunny.canDo();  //  I can do everything!


// P.s:俩个对象各自的方法,即使功能相同,但其所在引用地址不同
console.log(sunny.canDo === sunny.cando);    // false


new运算符

  • new的特点:

    1. new只能函数

    2. 自动创建空对象;

    3. this绑定到空对象;

    4. 隐式返还this;

通过new来改造工厂模式


构造函数

  • 构造函数要通过new来调用 this指向该空对象

  • 约定俗成构造函数首字母大写


prototype原型

  • 通过new实例化出来的对象其属性和行为来自两个部分,一部分来自构造函数,另一部分来自原型。

  • 当声明一个函数的时候,同时也申明了一个原型 。

  • 原型本身是一个对象。

  • 对象属性方法查找规则;


构造函数性能对比工厂函数

  • 公共空间存放公共方法




function Person(options) {
    this.name = options.name;
    this.age = options.age;
}
Person.prototype.canDo = function() {
    console.log("I can do anything!");
}

let rocky = new Person({
    name: "Rocky",
    age: 24
});

console.log(rocky);
rocky.canDo();


let sunny = new Person({
    name: "Sunny",
    age: 18
});

console.log(sunny);
sunny.canDo();

// P.s:构造函数原型上的方法属于公共方法
console.log(rocky.canDo === sunny.canDo);   //  true


函数prototype & 对象__proto__


image.png






案例:选项卡之面向对象

<body>
    <div class="tab1">
        <button style="background: lightblue;">Btn1</button>
        <button>Btn2</button>
        <button>Btn3</button>
        <p>Inner1</p>
        <p style="display: none;">Inner2</p>
        <p style="display: none;">Inner3</p>
    </div>
    <div class="tab2">
        <button style="background: lightblue;">Btn1</button>
        <button>Btn2</button>
        <button>Btn3</button>
        <p>Inner1</p>
        <p style="display: none;">Inner2</p>
        <p style="display: none;">Inner3</p>
    </div>
    <button class="nextPre">NextPre</button>
    <button class="autoPlay">AutoPlay</button>

    <script>
        function Tab(tabClass) {
            this.btns = tabClass.querySelectorAll("button");
            this.ps = tabClass.querySelectorAll("p");
            this.tabNum = this.btns.length;
            this.btnsFor();
        }
        Tab.prototype.btnsFor = function() {
            this.btns.forEach((btn, btnIndex) => {
                btn.onclick = () => {
                    this.psFor(btnIndex);
                }
            });
        }
        Tab.prototype.psFor = function(index) {
            this.ps.forEach((p, pIndex) => {
                if(pIndex === index) {
                    this.btns[pIndex].style.background = "lightblue";
                    this.ps[pIndex].style.display = "block";
                }else {
                    this.btns[pIndex].style.background = "";
                    this.ps[pIndex].style.display = "none";
                }
            });
        }
        Tab.prototype.getIndex = function() {
            let nowIndex;
            this.btns.forEach((btn, btnIndex) => {
                if(btn.style.background === "lightblue") {
                    nowIndex = btnIndex;
                }
            });
            return nowIndex;
        }

        let tab1 = document.querySelector(".tab1");
        let tabObj1 = new Tab(tab1);
        let nextPre = document.querySelector(".nextPre");
        nextPre.onclick = () => {
            let nowIndex = tabObj1.getIndex();
            nowIndex++;
            nowIndex = nowIndex >= tabObj1.tabNum ? 0 : nowIndex;
            tabObj1.psFor(nowIndex);
        }

        let tab2 = document.querySelector(".tab2");
        let tabObj2 = new Tab(tab2);
        let autoPlay = document.querySelector(".autoPlay");
        autoPlay.onclick = () => {
            let nowIndex = tabObj2.getIndex();
            setInterval(() => {
                nowIndex++;
                nowIndex = nowIndex >= tabObj2.tabNum ? 0 : nowIndex;
                tabObj2.psFor(nowIndex);
            }, 1000);
        }

    </script>
</body>


演示:

image.png


END

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。