JS----面向对象

发布于:2022-12-25 ⋅ 阅读:(457) ⋅ 点赞:(0)

以生活中的例子来看什么叫面向对象,什么叫面向过程

你是如何解决吃回锅肉的问题?

面向过程编程:解决问题的过程,按步骤进行,第一步做什么,第二步做什么,一步一步完成。比如洗买肉,再洗肉,切肉,炒肉,吃肉。

面向对象编程:找具有解决问题功能的对象,调用其功能,完成任务。如果对象不存在,则创建对象。点外卖,下馆子,妈妈做等。

软件世界面向对象

面向过程编程思想

按步骤一步一步解决问题

面向对象编程思想:

找解决问题对象,调用功能解决问题, 如果对象不存在

=> 自己创建对象,封装功能,解决问题


分割字符串  'html_javascript_css' 返回数组[html,javascript,css]

面向过程:

<script>
        function test1() {
            let str = 'javascript_css_html'
            let line = ''//存字符串
            let arr = []  //空数组
            //遍历数组字符串
            for (let i = 0; i < str.length; i++) {
                let chars = str.charAt(i)
                if (chars !== '_') {
                    line = line + chars
                } else {
                    if (line != '') {
                        arr.push(line)
                        line = ''
                    }           
                }
                if (i == str.length - 1 && line != '') {
                        arr.push(line)
                        line = ''
                    }
            }
            console.log(arr)
        }
        test1()
    </script>

如果用面向对象写:

        function test2(){
            let str = 'javascript_css_html'
            let arr=str.split('_')
            console.log(arr)
        }
        test2()

 


 

面向对象编程创建方式:简单方式new Object

  //创建方式
        let personObj=new Object();
        //对象属性
        personObj.name='小明'
        personObj.age=3
        //对象方法
        personObj.palyGame=function(){
            console.log('玩游戏')
        }
        personObj.palyGame()

面向对象编程创建方式:字面量方式

 let person={
            name:'小小',
            age:18,
            playGame:function(){
                console.log('玩游戏')
            }
        }
        person.playGame();

工厂函数:

//工厂函数
        function creat(name,age){
            return{
                name:name,
                age:age,
                say:function(){
                    console.log(this.name)
                }
            }
        }
        //生成实例对象
        var p1=creat('jack',18)
        var p2=creat('rose',17)
        console.log(p1)
        console.log(p2)

由此可以见:工厂函数方式创建对象,根据传入属性值生成不同对象

工厂函数缺点: 不知道对象数据类型

 构造函数:

——解析构造函数代码的执行

 function Person(name,age){
            //使用new操作符调用person()的时候,
            // 实际上会先创建一个对象
            // var instance={}
            //然后让内部的this指向instance对象
            // this=instance
            // 接下来所针对this的操作实际是instance
            this.name=name
            this.age=age
            this.say=function(){
                console.log(this.name)
            }
            //在函数的结尾会将this返回,也就是instance
            // return this
        }

而要创建Person 实例,则必须使用new 操作符。
以这种方式调用构造函数会经历以下4 个步骤:

  1.  创建一个新对象
  2. 将构造函数的作用域赋给新对象(因此this 就指向了这个新对象)
  3.  执行构造函数中的代码
  4. 返回新对象

构造函数:

构造函数 - 创建对象 指定对象数据类型
语法:
function Person(name,age){
// 对象属性和方法
this.name = name // this.name->给当前对象创建name属性,将形参name的值赋值给name属性this.age = age
this.say = function(){
consolo.log('说话方法') } }

let p1 = new Person('jack',18)
注: 
1. 构造函数名首字母大写
2. 函数体中定义属性和方法
不写其它形式代码
3. 使用new调用构造函数创建对象
对象的数据类型 => 构造函数名
let arr = new Array() // Array
 <style>
        *{
            padding: 0;
            margin: 0;
        }
        div{
            width: 200px;
            height: 200px;
            background-color: skyblue;
        }
        
    </style>
</head>
<body>
    <button class="btn">点我换皮肤</button>
    <div></div>
    <script>
        function ChangeColor(){
            this.btn=document.querySelector('.btn')
            this.div=document.querySelector('div')

            this.bindChange=function(){
                //方法中的this是当前对象
                let _this=this
                this.btn.addEventListener('click',function(){
                    //事件处理函数中的This是事件源
                     _this.div.style.backgroundColor='pink'
                })
            }
        }
        let c1=new ChangeColor()
        c1.bindChange()
    </script>
    

效果图: 

 

 

 如果对象属性是变量,调用对象属性时,点语句改为中括号!

 


每个构造函数都有一个prototype属性指向它的原型对象

    <script>
   
        function Person(name, age) {
            this.name = name
            this.age = age
            this.say = function () {
                console.log('说话')
            }
        }

        let p1 = new Person('jack', 18)
        let p2 = new Person('rose',20)
        console.log(p1)//Person {name: 'jack', age: 18, say: ƒ}

    </script>

 

// 构造函数
			function Person(name, age) {
				this.name = name
				this.age = age
			}

			// Person.prototype原型对象
            // 公共的say方法定义到Person构造函数的原型对象上
            // 所有实例对象都可以访问原型对象上公共的属性和方法
			Person.prototype.say = function () {
				console.log('说话')
			}
            // 实例对象
            let p1 =  new Person('jack',18)
            let p2 =  new Person('rose',20)
            p1.say()
            p2.say()

            console.dir(Person)  //dir方法显示对象结构
            console.dir(Person.prototype);
            console.dir(p1)
            console.dir(p2)


            console.log( Person.prototype === p1.__proto__ );

 

成员搜索原则:

面向对象编程思想

1. 找解决问题对象,如果对象存在调用其功能解决问题

2. 对象不存在,创建对象

3. 构造函数方式创建对象

- 构造函数: 对象私有的属性和方法定义在构造函数中

- 原型对象: 公共的属性和方法定义在原型对象上

对象成员(属性和方法)搜索原则:

先在实例对象上找,如果找不到,沿着隐式原型__proto__到原型对象上查找

 

     function Person(name, age) {
				this.name = name
				this.age = age
                // this.say = function(){
                //     console.log('构造函数 say');
                // }
			}
            // 原型对象
			Person.prototype.say = function () {
				console.log('原型对象 say')
			}

            // 实例对象
            let p1 =  new Person('jack',18)
            p1.say()

更简单的原型写法

<script>
			// 构造函数
			function Person(name, age) {
				this.name = name
				this.age = age
			}
			// 原型对象
			// Person.prototype.say = function () {
			// 	console.log('说话 say')
			// }
			// Person.prototype.eat = function(){
			//     console.log('吃饭')
			// }
			// Person.prototype.type = '中国人'

			Person.prototype = {
				constructor: Person, // 手动添加constructor属性指向它的构造函数
				type: '中国人',
				say: function () {
					console.log('说话 say')
				},
				eat: function () {
					console.log('吃饭')
				},
			}

			// 实例对象
			let p1 = new Person('jack', 18)
			p1.say()
			p1.eat()
			console.dir(Person.prototype)
		</script>

内置对象的原型 

new Object() Object.prototype

new Array() Array.prototype

new Date() Date.prototype

原型方法中的this指向调用该方法的对象

<script>
        console.dir(Array.prototype);

        Array.prototype.sum = function(){
            let s = 0
            for(let i = 0; i < this.length; i++){
                s += this[i]
            }
            return s
        }

        let arr = [10,20,30]
        let s = arr.sum()
        console.log('和是 ',s);


        let arr1 = [1,2,3,4,5,6,7,8,9]
        console.log( arr1.sum());

        function test1(){
            let arr = new Array(10,20,30)
            // let arr = [10,20,30]
            let i = arr.findIndex(item=>item==20)
            console.log(i);
        }
    </script>