我们创建构造函数的时候,原型对象上会有一个constructor属性,它是原型对象所独有的
1.instanceof
2.constructor

  1. function Person(name,age){
  2. this.name = name;
  3. this.age = age;
  4. }
  5. var p = new Person("cheng",20);
  6. console.log(p.constructor==Person)
  7. var arr = [1,2,3];
  8. console.log(arr.constructor == Array)

1.改变原型对象

问题:就是我们以直接量(对象)形式,给原型对象添加属性的时候,它的
constructor会指向Object
需要:重置constructor

  1. function Person(name,age){
  2. this.name = name;
  3. this.age = age;
  4. }
  5. /* 以字面量(对象)的形式给原型对象添加属性 */
  6. Person.prototype = {
  7. sayName:function(){
  8. console.log(this.name)
  9. },
  10. sayAge(){
  11. console.log(this.age)
  12. }
  13. }
  14. /* 问题:就是我们以直接量(对象)形式,给原型对象添加属性的时候,它的
  15. constructor会指向Object
  16. */
  17. var p = new Person("cheng",20);
  18. console.log(p.constructor)
  19. console.log(p.constructor==Person) //重置constructor
  20. console.log(p instanceof Person)

2.公有属性和私有属性

在构造函数中
公有 在一般在原型对象上
私有属性 通过this关键字去添加的
hasOwnProperty可以判断属性是私有的还是共有的

  1. Person.prototype = {
  2. constructor:Person,
  3. sayName:function(){
  4. console.log(this.name)
  5. },
  6. sayAge(){
  7. console.log(this.age)
  8. }
  9. }
  10. var p = new Person("cheng",20);
  11. console.log(p.hasOwnProperty("name"))
  12. console.log(p.hasOwnProperty("sayName"))

3.如何改变this关键字的指向call,apply,bind

函数正常调用的时候this指向window
函数要有对象去调用,事件也是需要对象去执行的

  1. var name = "张三"
  2. function show(){
  3. console.log(this.name)
  4. }
  5. function go(){
  6. var name = "李四"
  7. show();
  8. }
  9. window.go();

call 可以改变函数内部this关键字的指向 funName.call(obj)
applay funName.applay(obj)

  1. var name = "王五";
  2. var obj = {
  3. name:"李四"
  4. }
  5. function go(){
  6. console.log(this.name)
  7. }
  8. go();
  9. go.call(obj);
  10. go.apply(obj);

4.call,apply之间的区别

  1. 应用场景:传递多个参数的情况<br /> call 依次去传递<br /> applay 需要传递数组
  1. var name = "window"
  2. var zhang = {
  3. name: "张三"
  4. }
  5. function show(a, b) {
  6. console.log(this.name);
  7. console.log(a + b)
  8. }
  9. // show(1,2)
  10. // show.call(zhang,2,3);
  11. show.apply(zhang,[1,2])

5.bind

  1. bind绑定的函数不会马上执行,只是改变了函数上下文的执行环境
  1. var name = "window"
  2. var zhang = {
  3. name: "张三"
  4. }
  5. var show = function(a,b){
  6. console.log(this.name)
  7. console.log(a+b);
  8. }.bind(zhang);
  9. show(2,3);

使用场景

  1. <button id="btn">按钮</button>
  2. <script>
  3. var id = "1001"
  4. var btn = document.getElementById("btn");
  5. btn.onclick = function(){
  6. // console.log(this.id)
  7. window.setTimeout(function(){
  8. console.log(this.id)
  9. },1000)
  10. }
  1. <button id="btn">按钮</button>
  2. <script>
  3. var id = "1001"
  4. var btn = document.getElementById("btn");
  5. btn.onclick = function(){
  6. setTimeout(function(){
  7. console.log(this.id)
  8. }.bind(btn),1000)
  9. }
  10. <script>
  1. <button id="btn">按钮</button>
  2. <script>
  3. var id = "1001"
  4. var btn = document.getElementById("btn");
  5. btn.onclick = function(){
  6. var self = this;
  7. setTimeout(function(){
  8. console.log(this.id)
  9. }.bind(self),1000)
  10. }
  11. </script>
  1. <button id="btn">按钮</button>
  2. <script>
  3. var id = "1001"
  4. var btn = document.getElementById("btn");
  5. btn.onclick = function(){
  6. setTimeout(function(){
  7. console.log(this.id)
  8. }.bind(this),1000)
  9. }
  10. </script>

可以使用箭头函数解决this指向的问题

  1. var id = "1001"
  2. var btn = document.getElementById("btn");
  3. btn.onclick = function(){
  4. setTimeout(()=>{
  5. console.log(this.id)
  6. },1000)
  7. }