JavaScript

JavaScript - 函数 - 原型链

2017-02-27  本文已影响15人  西巴撸

上一小节讲到了基本包装类型,本小节继续补充面向对象的内容.有点多,有点杂.好像我每次都在强调耐心这个词,确实,没有耐心是学不好技术的,如果讲的不够详细,大家又是似懂非懂的状态,这样与你与我都不好 !
所以我会很耐心的去分享,希望读者也有耐心去学习!

原型链 --- 绘图展示

<script>
    function Animal(){

    }
    function Dog(){

    }
    //设置原型链(原型)继承
    var a1 = new Animal();
    Dog.prototype = a1;

    var dog1 = new Dog();
    console.log(Object.prototype.constructor);

    var o = {};
    console.log(o.constructor == Object.prototype.constructor);
    console.log(Object.prototype.__proto__ == Object.prototype);
</script>
**原型链 **

Object对象的补充点

<script>
    var str1 = new String("demo01");
    var str2 = new String("demo01");
    var str3 = str1;
    var str4 = "demo01";

    //判断是否相等
    console.log(str1 == str2);    //false(!!!!)
    console.log(str1 == str4);    //true(内部会隐式转换)

    console.log(str1 === str2);   //false
    console.log(str1 === str3);   //true
    console.log(str1 === str4);   //false

    var num1 = new Number(10);
    var num2 = 10;
    var num3 = new Number(10);

    console.log(num1 == num2);      //true
    console.log(num1 == num3);      //false
</script>

Object.prototype详解

1.object类型的对象 返回的什么 [obejct Object]
2.其他对象类型如函数 | 数组 ,返回对应的字符串形式
3.Number类型 可以传递参数(进制) 不传递参数:默认是十进制

1.基本包装类型(String Number Boolean),返回对应的基本类型的值
2.object类型的,返回this(该对象本身)
3.date(日期类),返回时间戳

<script>
    function Person(){}
    var obj = {name:"name"};
    Person.prototype = obj;  //替换原型对象
    Person.constructor = Person;

    var p1 = new Person();

    console.log(obj.isPrototypeOf(p1));  //是原型对象
    console.log(Object.prototype.isPrototypeOf(p1));
    // true   整条原型链上面的原型对象都会进行判断
</script>
<script>
    var obj = {name:"张三",age:23};
    //console.log(Object.getOwnPropertyDescriptor(obj, "name"));
    //设置属性
    Object.defineProperty(obj,"age",{
        enumerable:false,
    });

    for(var k in obj)
    {
        console.log(k, obj[k]);
    }
</script>
<script>
    var o = {name:"dingding"};
    console.log(o.toString());    //[obejct Object]
    var arr = ["demo01","demo02","demo03"];
    console.log(arr.toString());  //demo01,demo02,demo03
    function demoTest(){};
    // console.log(demoTest.toString());  //function demoTest(){}

    var num = new Number(10);
    console.log(num.toString());  //20
    console.log(num.toString(2));  //二进制 -- 1010 --- > 1 * 2*2*2 + 0 *2*2 + 1*2 + 0*1 = 8 + 0 + 2 + 0 = 10
    console.log(num.toString(3));  //三进制 -- 101  ---> 1*3*3 + 0 * 3 + 1 *1 = 9 + 0 + 1 = 10
    console.log(num.toString(7));   //七进制 -- 13  ---> 1 * 7 + 3*1 = 10

    var str = new String("tese");
    console.log(str.valueOf());  //tese
    var o = {name:"jiji"};
    console.log(o.valueOf());
    var date = new Date();   //当前的时间
    console.log(date.valueOf()); //1488163624297 时间戳,是一个绝对的值
</script>

Object的静态成员和实例成员

实例成员

静态成员

1.configurable:true 是否是可以配置的(能不能删除属性或者是修改这个配置本身)
2.enumerable:true 是否是可以枚举的(在for..in循环中是否能够遍历出来|keys())
3.value:"zhangsan" 属性对应的值
4.writable:true 是否是可重写的

<script>
    var obj = {};
    //Object.defineProperty来新增属性并且设置属性的描述对象
    Object.defineProperty(obj,"age",{
        value:"100"
    });
    console.log(Object.getOwnPropertyDescriptor(obj, "age"));
</script>
<script>
    var obj = {name:"zhangsan",age:78};
    console.log(Object.getOwnPropertyNames(obj));
    console.log(Object.getPrototypeOf(obj) == Object.prototype);
</script>
``

- **Object.keys --> 获得对象的key 不包含原型属性**
- **示例代码 :**

```javascript  
<script>
    function Person(){
        this.name = "momo"
    };
    Person.prototype.say = "say";
    var p1 = new Person();
    console.log(Object.keys(p1));
    console.log(Object.getOwnPropertyNames(p1));
</script>
<script>
    var o = {};
    o.name = "names";
    console.log(o);
    Object.preventExtensions(o);
    o.age = 30;
    console.log(o);
</script>
<script>
    var obj = {des:"des"};
    Object.freeze(obj);
    obj.name = "momo";
    obj.age = 20;
    console.log(obj);
    delete obj.des;
    console.log(obj);
    obj.des = "能不能修改";
    console.log(obj);
</script>
**Object的静态成员**

Function的构造函数的使用

创建函数的几种方法

<script>
    function func01(){
        //函数体
    }

    var func02 = function name(){};  //命名函数表达式
    var func03 = function (){};      //匿名函数表达式

    var func04 = new Function("console.log(\"1\");");
    func04();
</script>
<script>
    // 操作符 + 拼接字符串的方式
    var func = new Function("console.log(\"让我掉下眼泪的,不是昨夜的酒\");" +
            "  console.log(\"让我依依不舍的,不止你的温柔\");" +
            "console.log(\"余路还要走多久,我牵着你的手\");");
    func();
</script>
<script type="text/template" id="demo">
    // 使用js模板来存放数据
    console.log("让我掉下眼泪的,不是昨夜的酒");
    console.log("让我依依不舍的,不止你的温柔");
    console.log("余路还要走多久,我牵着你的手");
</script>
<script>
    var func = new Function(`
            // 反括号``
            console.log(\"让我掉下眼泪的,不是昨夜的酒\");
            console.log(\"让我依依不舍的,不止你的温柔\");
            console.log(\"余路还要走多久,我牵着你的手\");`);
    func();
</script>
<script>
    var script = document.getElementById("demo");
    var str = script.innerHTML;
    var func = new Function(str);
    func();
</script>

**更多内容 ---> 点击跳转 **

上一篇 下一篇

猜你喜欢

热点阅读