烟台网站排名优化报价,有什么软件可以做网站,有了域名和空间怎么建网站,知名企业文化案例一. 普通对象与函数对象 JavaScript 中#xff0c;万物皆对象#xff01;但对象也是有区别的。分为普通对象和函数对象#xff0c;Object 、Function等 是 JS 自带的函数对象。下面举例说明。 var o1 {};
var o2 new Object();
var o3 new f1();function f1(){};
var f2… 一. 普通对象与函数对象 JavaScript 中万物皆对象但对象也是有区别的。分为普通对象和函数对象Object 、Function等 是 JS 自带的函数对象。下面举例说明。 var o1 {};
var o2 new Object();
var o3 new f1();function f1(){};
var f2 function(){};
var f3 new Function(str,console.log(str));console.log(typeof Object); //function
console.log(typeof Function); //function console.log(typeof f1); //function
console.log(typeof f2); //function
console.log(typeof f3); //function console.log(typeof o1); //object
console.log(typeof o2); //object
console.log(typeof o3); //object 在上面的例子中 o1 o2 o3 为普通对象f1 f2 f3 为函数对象。怎么区分其实很简单凡是通过 new Function() 创建的对象都是函数对象Function其他的都是普通对象Object。f1,f2,归根结底都是通过 new Function()的方式进行创建的。Function Object也都是通过 New Function()创建的。 二. 原型对象 function Person(){}
Person.prototype.name test;
Person.prototype.age 28;
Person.prototype.job Software Engineer;
Person.prototype.sayName function() {alert(this.name);
}var person new Person(); 在 JavaScript 中每当定义一个对象函数也是对象时候对象中都会包含一些预定义的属性。其中每个函数对象都有一个prototype属性这个属性指向函数的原型对象。而原型对象他本身就是一个普通对象没有通过 new Function() 创建的对象都是普通对象即原型对象就是Person.prototype如果你还是害怕它那就把它想想成一个字母 Avar A Person.prototype。这里要强调一点只有函数对象才会拥有prototype属性但是每个对象都拥有__proto__属性null除外。 在上面我们给A添加了四个属性name、age、job、sayName。其实它还有一个默认的属性constructor。在默认情况下所有的原型对象都会自动获得一个 constructor构造函数属性这个属性是一个指针指向 prototype属性所在的函数Person。即Person.prototype.constructor Person。当我们创建对象var person new Person()时person可以继承原型对象Person.prototype的constructor属性因此person.constructor Person注意person这个实例本身是没有constructor实例的constructor是通过原型链__proto__获取原型对象上边的constructor。 person.constructor Person
Person.prototype.constructor Person 从这一角度我们可以将Person.prototype理解为Person的一个实例。但其实原型对象Person.prototype并不是构造函数Person的实例而是构造函数的属性而且是预定义添加的。 var A new Person();
Person.prototype A; 但是有一个非常特别的原型对象Function.prototype它并不是普通对象而是函数对象而这个函数对象却没有prototype属性前面所说的“每个函数对象都有一个prototype属性这个属性指向函数的原型对象”对Function.prototype并不适用。 function Person(){};
console.log(typeof Person.prototype) //Object
console.log(typeof Function.prototype) // Function这个特殊
console.log(typeof Object.prototype) // Object
console.log(typeof Function.prototype.prototype) //undefined Function.prototype为什么是函数对象呢 var A new Function();Function.prototype A; 上文提到过凡是通过凡是通过 new Function() 创建的对象都是函数对象其他的都是普通对象。因为 A 是函数对象所以Function.prototype是函数对象。 三. __proto__ JS 在创建对象不论是普通对象还是函数对象的时候都有一个叫做__proto__的内置属性用于指向创建它的构造函数的原型对象。对象 person有一个__proto__属性创建它的构造函数是Person构造函数的原型对象是Person.prototype 所以person.__proto__ Person.prototype Person.prototype.constructor Person;
person.__proto__ Person.prototype;
person.constructor Person; 类似的Person.__proto__ Function.prototypePerson.prototype.__proto__ Object.prototypeObject.__proto__ Function.prototype Object.prototype.__proto__ null按照上述理解 Object.prototype是普通对象而普通对象的构造函数是Object那么Object.prototype.__proto__ Object.prototype从而在原型链上形成死循环无法终止因此定义Object.prototype.__proto__ nullnull是原型链的顶端。 不过要明确的真正重要的一点就是这个连接存在于实例person与构造函数Person的原型对象Person.prototype之间而不是存在于实例person与构造函数Person之间。 var animal function(){};
var dog function(){};animal.price 2000;
dog.prototype animal;
var tidy new dog();
console.log(dog.price) //undefined
console.log(tidy.price) // 2000 实例tidy和 原型对象dog.prototype存在一个连接。这个连接存在于实例tidy与构造函数的原型对象dog.prototype之间而不是存在于实例tidy与构造函数dog之间。 四. 函数对象 所有函数对象的__proto__都是指向Function.prototype它是一个空函数。 Number.__proto__ Function.prototype // true
Number.constructor Function //trueBoolean.__proto__ Function.prototype // true
Boolean.constructor Function //trueString.__proto__ Function.prototype // true
String.constructor Function //true// 所有的构造器都来自于Function.prototype甚至包括根构造器Object及Function自身
Object.__proto__ Function.prototype // true
Object.constructor Function // true// 所有的构造器都来自于Function.prototype甚至包括根构造器Object及Function自身
Function.__proto__ Function.prototype // true
Function.constructor Function //trueArray.__proto__ Function.prototype // true
Array.constructor Function //trueRegExp.__proto__ Function.prototype // true
RegExp.constructor Function //trueError.__proto__ Function.prototype // true
Error.constructor Function //trueDate.__proto__ Function.prototype // true
Date.constructor Function //true 所有的构造器都来自于Function.prototype甚至包括根构造器Object及Function自身。所有构造器都继承了Function.prototype的属性及方法。Function.__proto__ Function.prototype而前面说过Function.prototype它不是普通对象而是函数对象那么Function.prototype.__proto__ ?按照上述Function.prototype.__proto__ Function.prototype但又出现了原型链上的死循环JS一直强调万物皆对象函数对象也是对象给他认个祖宗指向 Object.prototypeObject.prototype.__proto__ null保证原型链能够正常结束。 特别的MathJSON是以普通对象形式存在的。 Math.__proto__ Object.prototype // true
Math.construrctor Object // trueJSON.__proto__ Object.prototype // true
JSON.construrctor Object //true 四. 总结 原型和原型链是JS实现继承的一种模型。 原型链的形成是真正是靠__proto__而非prototype。 参考资料https://www.jianshu.com/p/dee9f8b14771 转载于:https://www.cnblogs.com/RainyBear/p/8612560.html