function Person(name) {
this.name = name;
};
Person.prototype.getName = function() {
return this.name;
};
/*
以下语句的实际运行过程是:
第一步,建立一个新对象(叫p吧);
第二步,将该对象(p)内置的原型对象(即__proto__属性指向的对象)设置为构造函数(就是
Person)的prototype 属性引用的那个原型对象;即p.__proto__ = Person.prototype
第三步,将该对象(p)作为this 参数调用构造函数(就是Person),完成成员设置等初始化工作。
*/
var p = new Person("ZhangSan");
//若以以下两句代替上面那句,则不能执行p.getName()
//var p = {};
//Person.call(p);
console.log(Person.prototype.constructor === Person); // true
/*
p本身没有constructor属性,但p的__proto__指向Person.prototype,所以实际上p.constructor 调用的是
Person.prototype.constructor
*/
console.log(p.constructor === Person); // true
附:Person.constructor 不等于 Person.prototype.constructor
javasciprt的类概念是假的类概念,试图以prototype表示对象原型(即类),但事实上new出来的实例是与类通过共用同一个原型对象达到模板的效果,在此基础上同时限定了修改对象的属性并不会直接修改到原型对象,而修改原型对象的属性作用到每个对象上,从而保证了由类创建对象(即类->对象)的要义效果。
--------------------------------------------------------------------------------------------------------------------
constructor例子分析
1. function A(){
var s = "mianqiang";
}
function B(){}
var a = new A();
A.prototype.constructor = B;
alert(a.constructor);//输出的是B函数
2. function A(){
var s = "mianqiang";
}
function B(){}
var a = new A();
a.constructor = B;//这种情况下constructor只是作为a的一个普通属性值
alert(a.constructor);//输出的是B函数
alert(A.prototype.constructor);//输出的是A函数(重点)
3. function A(){
var s = "mianqiang";
}
function B(){ }
function C(){}
var a = new A();
a.constructor = B;
A.prototype.constructor = C;
alert(a.constructor);//输出B
alert(A.prototype.constructor); //输出C
4. function a(){
this.cc = function(){alert("ac")};
}
a.prototype.bb = function(){
alert("aa");
}
function b(){
//mark 1: this.cc = function(){alert("bc")};
}
b.prototype.bb = function(){
alert("bb");
}
/*
下面语句将b的constructor转成函数a。此例子在于说明constructor的影响很小,更改成a并不会引起
new b()会采用a去构造对象(重点)
mark 2:
*/
b.prototype.constructor = a;
//mark 3: b.prototype = a.prototype;
var z1 = new b();
z1.bb(); //bb,若注释mark 2,去掉mark 3注释,则显示aa,但下面的z1,.cc()仍是报undefined
//z1.cc is not a function(cc为undefined) ,如果把mark 1处的注释去掉,则输出“bc”
z1.cc();
--------------------------------------------------------------------------------------------------------------------
prototype的作用范围
1. function A(){}
A.prototype.pa = 10;
var a1 = new A();
alert(a1.pa);//10
a1.pa = 50;
var a2 = new A();
alert(a2.pa);//10
2. function A(){}
A.prototype = {pa:10};
var a1 = new A();
alert(a1.pa);//10
a1.pa = 50;
var a2 = new A();
alert(a2.pa);//10
3. function A(){}
A.prototype.ca = {pa:10};
var a1 = new A();
alert(a1.ca.pa);//10
//a1.ca = {};
a1.ca.pa = 50;
/*
a1为实例,a1实例没有ca属性,所以a1.ca.pa这样的路径是直接影响在prototype的ca里的pa属性上;
如果a1有ca属性(参看上面的注释句),则不会影响到prototype的ca里的pa属性上,
而是影响在a1实例的ca对象的pa属性上,这种情况下最后a2.ca.pa输出的值则是10而不是50
这种修改一个对象实例的属性从而影响到类的原型属性是个错误的用法,打破了JavaScript试图表达类概念的意图,同时也显示JavaScript的类概念是伪类
*/
var a2 = new A();
alert(a2.ca.pa);//50
4. function A(){}
A.prototype.ca = {pa:10};
var a1 = new A();
alert(a1.ca.pa);//10
a1.ca = {ht:20};
var a2 = new A();
alert(a2.ca.pa);//10
5. function A(){}
A.prototype.ca = {pa:10};
var a1 = new A();
alert(a1.ca.pa);//10
a1.ca = {ht:20};
var a2 = new A();
alert(a2.ca.ht);//undefined
总结:假设:实例inst本身没有属性a,但inst所属函数Func的prototype有属性a。执行console.log(inst.a),会去读取Func的prototype上的属性a;若执行语句inst.a=10,则视为为实例本身添加a这个属性并且赋值为10,而非修改了Func的prototype上的a属性值。
--------------------------------------------------------------------------------------------------------------------
其他
- 任何函数对象都有prototype属性,prototype属性通常为"object"类型,除了 Function.prototype,它 为"function"类型,虽然Function.prototype是一个函数对象,但Function.prototype.prototype为 undefined;普通对象没有prototype属性;
- 对象都有__proto__属性。Object.prototype.__proto__ 为 null。
function func(){}
alert(typeof func.prototype);//output : "object"; 注意这里的"object"的"o"是小写的
alert(typeof null);//output: "object"
alert(typeof Object);//output: "function"
alert(typeof Number);//output: "function"
alert(typeof Function);//output: "function"
继承:
function Person(name, age) {
this.name = name,
this.age = age
}
Person.prototype.setAge = function () {
console.log("111")
}
function Student(name, age, price) {
Person.call(this, name, age)
this.price = price
this.setScore = function () {}
}
Student.prototype = Object.create(Person.prototype)//核心代码
Student.prototype.constructor = Student//核心代码
var s1 = new Student('Tom', 20, 15000)
console.log(s1 instanceof Student, s1 instanceof Person) // true true
console.log(s1.constructor) //Student
console.log(s1)
参考:
Js中Prototype、__proto__、Constructor、Object、Function关系介绍
相关推荐
分析javascript中 prototype __proto__ constructor之间的关系
JavaScript中的`prototype`、`__proto__`和`constructor`是理解JavaScript面向对象编程的关键概念。这篇文章通过图解的方式深入浅出地解析了这三个概念之间的关系。 首先,`__proto__`属性是对象独有的,它指向对象...
在JavaScript中,prototype和__proto__是理解对象原型继承机制的关键知识点。下面将详细介绍这两者之间的关系以及它们在JavaScript对象继承中所扮演的角色。 首先,prototype属性是函数所独有的。在JavaScript中,...
1、任何一个函数内都有prototype属性,这个prototype属性指向另一个对象 ,这个对象就是就是原型对象 ,简称原型。注意这个prototype是函数本身所自带的属性 2、原型的作用就是实现方法共享,将多个对象会调用的相同...
在JavaScript中,`prototype`和`__proto__`都是与对象继承和原型链紧密相关的概念,但它们在用途和性质上有所不同。以下是这两者的主要区别和详细解释: 1. **prototype(原型)** - `prototype`是函数特有的属性...
它的作用就是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(可以理解为父对象)里找,如果父对象也不存
在javascript中,prototype、constructor以及__proto__之间有着“著名”的剪不断理还乱的三角关系,楼主就着自己对它们的浅显认识,来粗略地理理以备忘,有不对之处还望斧正。
JavaScript中的`prototype`、`__proto__`和`constructor`是理解JavaScript面向对象编程的关键概念。这篇文章将通过图解的方式帮助读者深入理解这三个属性的关系。 首先,`__proto__`属性,它存在于每个对象中,表示...
在标题"boa.rar_Boa_Construct_boa_boa constructor_boa constructor chm_bo"中,我们可以看到关键词"Boa Constructor"和"boa constructor chm",这表明压缩包可能包含了Boa Constructor的安装文件或文档,如CHM...
JavaScript中的原型(Prototype)机制是实现对象继承的一种方式,它涉及到`prototype`和`__proto__`两个关键概念。在JavaScript中,每个函数都有一个`prototype`属性,而每个对象都有一个`__proto__`属性。 1. `...
深化浅析JavaScript中的constructor_ constructor 属性是 JavaScript 中的一种特殊属性,它返回对创建此对象的数组函数的引用。下面我们来深入浅析 JavaScript 中的 constructor。 constructor 属性是一个非标准...
7z-SFX Constructor是一款由俄罗斯人编写的用于创建和编辑7z SFX 自解压文件的工具,用于创建自解压安装包,SFX脚本编辑器强大。可以自定义自解压文件的提示、对话框、图标、执行文件及数字签名等信息。
7z-SFX Constructor是一款由俄罗斯人编写的用于创建和编辑7z SFX 自解压文件的工具,用于创建自解压安装包,SFX脚本编辑器强大。可以自定义自解压文件的提示、对话框、图标、执行文件及数字签名等信息。
客户端原型污染 介绍 如果您不熟悉原型污染攻击,则应首先阅读以下内容: Olivier Arteau的NodeJS...constructor.prototype.test=test ?__proto__.test=test ?__proto__[test]=test ?__proto__[test]={"json":"value"}
5. `Function.__proto__` → `Function.prototype` (0x700),且`Function.prototype.constructor`指向`Function` 6. `Object.prototype.constructor`指向`Object` 通过这样的结构,JavaScript实现了对象间的继承和...
不求甚解 – – liao一下prototype 如果你爱我,就干了这碗热热的毒鸡汤! 在父母的期望面前我们不敢说不行,我们总是用行动告诉他们我们是真的不行。欧耶! 关于prototype,怎么说呢,以前的前端开发是经常用的,...
每个JavaScript对象都有一个内部链接到另一个对象,这个链接被称为__proto__,它指向对象的原型对象,即prototype。 __proto__属性可以追溯到JavaScript的早期版本,那时候JavaScript的继承机制主要是通过原型链来...