JS学习之面向对象(面向对象的创建方法,new运算符的工作原理)

面向对象,是一种编程思想
可以添加属性(变量)和方法(函数)。
特点:
1、把功能写成一个函数
2、函数必须在对象身上 调用 对象.方法名()
3、对象身上的功能可以继承

创建对象的方法
1、 {} 字面量创建
2、 new Object()

3: 用构造函数创建

4:Object.create方法创建
创建完的对象有2个特点
1、 可以添加属性 (属性的值为非函数的任意数据类型)
2、 添加方法

//第一种创建对象方法
 var obj={
         name : '小徐',
         age  : 28,
         sing : function(){
               console.log('小徐现在在学JS的面向对象知识');
         }
      }
  console.log(obj); 
   //可以直接给对象添加属性和方法
   obj.height='163cm';
   obj.play=function(){
       console.log('我在学习');
   }
   //第二种创建对象的方法
   var obj1=new Object();
   console.log(obj1);
   obj1.name='jiajia';
   obj1.work=function(){
        console.log("他是个苦逼的程序员");
   }

// 用构造函数创建对象
function M (name){ this.name = name; } var obj3=new M('jiajia');
// 用Object.create方法创建对象

var p ={name:'jiajia'} var obj4=Object.create(p); console.log(obj4);

new   一元运算符,后面只能跟函数,用来调用函数

用new 调用函数的执行过程
1、自动创建一个空对象
2、把函数内部的this指向创建的这个对象
3、在函数执行完之后自动返回创建的那个对象,即使函数里面没有return
4、 函数里有return
      1)return的是对象,返回的是这个对象
      2)return的是非对象,返回的是那个创建的对象

注意:1、用new 调用的函数,返回的永远是一个对象
          2、使用new 调用的函数就是一个用来创建对象的函数(构造函数)

 function   test(){
     console.log(this);
 }
      
 test(); // window  函数是window身上的一个方法,所以this 指向的是window
 new test(); // {} 用new 调用函数创建了一个空对象并且把this指向了该对象
    
 var res1=test();
 var res2=new test();
 console.log(res1); // undefined 因为在函数声明的时候并没有 return 
 console.log(res2);         // { }  一个空对象
 /*
 new 调用函数背后实现的原理
     var new2=function(func){
     var obj=Object.create(func.prototype);  //创建一个空对象,并且继承了传入参数的原型
     var k=func.call(obj); // 改变this指向
     if(typeof k === 'object'){
        return k;  // 如果传入的参数是个对象,返回该对象
       }else{
        return obj; // 如果传入的是个非对象,返回空间的那个空对象
       }
     }
// new test() ,这个new的调用的背后工作原理就是 new2(test)这个实现的步骤
*/ function test1(){ return [1,2,3]; } var res3=test1(); var res4=new test1(); console.log(res3); // [1,2,3] console.log(res4); // [1,2,3] function test1(){ return 1; } var res3=test1(); var res4=new test1(); console.log(res3); // 1 console.log(res4); // { } 用new 调用的函数return的是非对象,返回的是创建的那个对象
原文地址:https://www.cnblogs.com/xubj/p/9879439.html