构造函数、原型对象、原型链知识检测

强行给数组的长度拉长,后边的元素为empty

最详尽的 JS 原型与原型链终极详解,没有「可能是https://www.jianshu.com/p/dee9f8b1477

对象分2种:普通对象、函数对象?【各自举例说明以及如何区分】

结论:凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。
构造函数篇

1.代码如何实现?
function Person(name, age, job) {
 this.name = name;
 this.age = age;
 this.job = job;
 this.sayName = function() { alert(this.name) } 
}
var person1 = new Person('Zaxlct', 28, 'Software Engineer');
var person2 = new Person('Mick', 23, 'Doctor');


2.记:构造函数的实例都有一个 constructor (构造函数)属性,该属性(是一个指针)指向 Person。
 
console.log(person1.constructor == Person); //true
console.log(person2.constructor == Person); //true

3.创建对象的构造器有哪些?
   最先想到Object,也可以是 Array,Date,Function
    var b = new Array();
    b.constructor === Array;
    b.__proto__ === Array.prototype;

    var c = new Date(); 
    c.constructor === Date;
    c.__proto__ === Date.prototype;

    var d = new Function();
    d.constructor === Function;
    d.__proto__ === Function.prototype;

4. 如何检测构造器是普通对象还是函数对象?
  type of Array/Function/Number/String/Date/Blooan
原型对象篇:

1.原型对象就是 Person.prototype

2.它还有一个默认的属性 constructor(是一个指针,指向 prototype 属性所在的函数)
例如:Person.prototype.constructor == Person 控制台验证了确实成立。分析:
     拆解:Person.prototype 原型对象; .constructor原型对象的默认属性constructor(指针,指向指向 prototype 属性所在的函数即右侧的Person)
  

3.每个【函数对象】都有一个prototype 属性,这个属性指向函数的原型对象。

4.原型对象其实就是普通对象(但 Function.prototype 除外,它是函数对象,但它很特殊,他没有prototype属性。

5.在 JS 中,每当定义一个对象(函数也是对象)时候,对象中都会包含一些预定义的属性。

7. Function.prototype 是函数对象。---证明例子:
   var AA = new Function(); --- 因为new Function()产生的对象都是函数对象。即AA是函数对象
   Function.prototype = AA; --- 把AA赋值给左边,那左边也肯定也就是 函数对象了。

8.实例没有的属性,js会尝试往原型对象上找,原型对象上没有,再往原型对象的-proyo-(Object.prototype)上找,最终会找到Object.prototype._proto_(他就是原型链的终点null),找到就返回对应的值,没找到就返回undefined

 9.Object.create() 这个方法本来就是用来修改对象的 __proto__ 的指向的。Object.create(null) 就说明产生的对象没有 __proto__ 属性咯.

10.JS 在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__ 的内置属性,用于指向创建它的构造函数的原型对象。例:
  对象 person1 有一个 __proto__属性,创建它的构造函数是 Person,构造函数的原型对象是 
Person.prototype ,所以: person1.__proto__ == Person.prototype

11.中文解读:
 Person.prototype.constructor == Person; -----原型对象的默认属性constructor(指针)指向prototype所在的函数。
 person1.__proto__ == Person.prototype; ----- 每个JS对象都有个内置属性__proto__,指向其构造函数的原型。
 person1.constructor == Person;

12.了解:绝大部分浏览器都支持__proto__属性,所以它才被加入了 ES6 里


10.原型主要干嘛用?
继承

11.代码实例:
function Person() {}
Person.prototype.name = 'Zaxlct';
Person.prototype.age  = 28;
Person.prototype.job  = 'Software Engineer';
Person.prototype.sayName = function() {
  alert(this.name);
}
  
var person1 = new Person();
person1.sayName(); // 'Zaxlct'

var person2 = new Person();
person2.sayName(); // 'Zaxlct'

console.log(person1.sayName == person2.sayName); //true


12.个人总结/结论💡:在函数对象的原型上挂一些属性和方法,那new实例出来的对象们,的方法是完全相等的

原型链知识检测:

  1. person1.__proto__ 是什么?
  2. Person.__proto__ 是什么?
  3. Person.prototype.__proto__ 是什么?
  4. Object.__proto__ 是什么?
  5. Object.prototype__proto__ 是什么?

答案:
第一题:
因为 person1.__proto__ === person1 的构造函数.prototype
因为 person1的构造函数 === Person
所以 person1.__proto__ === Person.prototype

第二题:
因为 Person.__proto__ === Person的构造函数.prototype
因为 Person的构造函数 === Function --------构造器的构造函数是Function
所以 Person.__proto__ === Function.prototype

第三题:
Person.prototype 是一个普通对象,我们无需关注它有哪些属性,只要记住它是一个普通对象。
因为一个普通对象的构造函数 === Object
所以 Person.prototype.__proto__ === Object.prototype

第四题,参照第二题,因为 Person 和 Object 一样都是构造函数

第五题:
Object.prototype 对象也有proto属性,但它比较特殊,为 null 。因为 null 处于原型链的顶端,这个只能记住。
Object.prototype.__proto__ === null

  • 每个函数对象都有一个prototype 属性,这个属性指向函数的原型对象
  • 每个构造函数实例都有一个 constructor (构造函数)属性,该属性(是一个指针)指向 Person 
  • 每个对象都有__proto__属性,但只有函数对象才有prototype属性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值