一,什么是对象

(1).在js中万物皆对象

(2).对象有自己的属性,属性的属性值可以为任何的内容,当属性值为函数的时候,我们称之为方法。当属性质为对象的时候,称之为子对象

    var obj = {
            a : 100,
            b : function(){},
            c : []
            d
        }

(3)数据类型
        原始    number boolean string undefined null

        引用   object array function

        不可以改变的原始类型和可以改变的引用类型(地址的改变)
        数据的存储,存储是一个地址,不管是原始类型还是引用类型


        比较运算的时候
        原始类型只会去比较内容
        引用类型比较的时候只会去比较地址,地址相等,内容就相等

 

var abc = 100;    //此次abc定义以后,产生了一个地址
        abc = 200;    //当abc发生改变的时候,从新的更换了地址
        console.log(abc);


        var arr = [];   //只要定义出来了以后,这个引用类型就占据自己的一个空间。引用类型就是引用的一个地址
        arr[0] = 200;
        arr = {}    //这个是强行的改变了地址
        console.log(arr);

 

二.创建的形式

(1).对象字变量

var obj = {};

(2).系统的构造函数

 

var obj = new Object();

 

(3).自己自定义的构造函数

function Person(){
            this.name = "jack";
            this.age = "30";
        }
        var p1 = new Person()

 构造函数,  就是一个函数,只是说这个函数是用来出对象用的。 遵循大驼峰命名规则(人为定义)

// 对象的增删查改
        var obj = {};
        // 增加:   obj.name = "jack"
        // 删除:   delete 对象.属性
        obj.name = "jack";
        delete obj.name;
        console.log(obj)
        // 查看:   对象打点
        // 改       对象打点

三.new关键字(当他使用后,内部结构会发生变化)

 

function Person(){
            // var this = {};    //当你使用new关键字调用函数以后,里面会产生一个this的空对象
            this.name = "jack";
            this.age = "30";
             return [];     ///最后返回this


            //我强行去改变return的值
        //    return "hallo wold";    //如果要强行改变,必须返回的为引用数据类型,原始数据类型不能返回
        }
        var p1 = new Person()
        console.log(typeof p1)

 

四.原始数据类型的字符串

var str = "hello world";
        //字符串对象
        var str1 = new String("hello world");   //new + 构造函数    str1肯定是一个对象

        console.log(typeof str)
        console.log(typeof str1)
        // 原始类型是不能添加属性和方法的
        str.abc = "nihao "    //可以添加上去,但是马上删除,因为他是原始类型
        console.log(str.abc);

        str1.abc = "nihao";
        console.log(str1.abc);


        // 包装类
        var num = 10;
        var num1 = new Number(10);
        console.log(num,num1)

        var bol = true;
        var bol1 = new Boolean(true);
        console.log(bol,bol1)
        console.log(typeof num1)

 

五.原型对象与原型链

(1)原型就是一个属性,这个属性是构造函数的属性,构造函数是用来制造用来出对象的,是构造函数制造出来的公共祖先,后面所有的对象都会继承原型的属性与方法(原型也是个对象)

(2)__proto__这个是用来查看原型的,这个是对象的属性,这个属性可以查看但是不能修改(隐式属性)

(3)prototype 设置原型,这个是构造函数的属性

 

    Person.prototype.play = "会玩"    //公共祖先
        function Person(name,age){
            // var this = {
                // __proto__ : Person.prototype
            // }
            this.name = name;
            this.age = age;

            // return this;
        }

        var p1 = new Person("jack",20);
        var p2 = new Person("mack",30);
        console.log(p1);
        console.log(p2);


        console.log(p1.__proto__)
        console.log(p1.constructor)    //这个是对象的属性,主要是看该对象的爹是谁
      
        var obj = {

        }

        console.log(obj.constructor)
        var str1 = "123"
        //String.prototype.abcd = "456"
        str1.abcd

        //利用原型的特点,可以提取对象的公共属性,解决代码的耦合

问题1:以下程序中输出的结果为:

        Array.prototype.say = function(){
            console.log('数组会说话了')
            return 
        }

        var arr = [];   //数组字面量
        var arr1 = new Array()   //new 数组的构造
         arr.say()
         console.log(arr.say())
结果:数组会说话了 ;undefined
原因:如果没有返回值语句或表达式,则会返回undefined;
如果没有合法的表达式语句或表达式,则会抛出语法错位的异常


(5).原型链

 

 

举例:

    Grand.prototype.zhangxiang = "帅";
        function Grand(){
            this.play = "会打球"
        }
        var grand = new Grand();
        Father.prototype = grand;
        function Father (){
            this.name = "小明"
        }
        var father = new Father();
        Son.prototype = father;
        function Son(){
            this.hobbit = "smoke"
        }
        var son = new Son()

面试题:


        // javascript中,有几种数据类型?
        // 怎么去判断这些数据类型?typeof
        // typeof可以返回几种值?
            // 六种
            // number string boolean undefined object function

            // typeof null
            // typeof array
            // typeof object
        // 怎么去区分这三个object?
        // Object.prototype.toString.call()