Home  >  Article  >  Web Front-end  >  JS Inheritance--Prototype Chain Inheritance and Class Inheritance_Basic Knowledge

JS Inheritance--Prototype Chain Inheritance and Class Inheritance_Basic Knowledge

WBOY
WBOYOriginal
2016-05-16 17:37:491611browse

What is inheritance? Answer: The process of others giving it to you for free is called inheritance.

Why use inheritance? Answer: Just pick it up ready-made.

Well, since everyone wants to pick up what’s already available, we need to learn how to inherit it!

Before understanding, you need to understand concepts such as Constructor, Object, Prototype Chain...

Two inheritance methods commonly used in JS:

    Prototype chain inheritance (inheritance between objects) class inheritance (inheritance between constructors)

Prototype Chain Inheritance:

Copy code The code is as follows:

//Object to be inherited
var parent= {
name : "baba"
  say : function(){
alert("I am baba");
}
}

//New object
var child = proInherit(parent);

//Test
alert(child.name); //"baba"
child.say(); //"I am baba"

Use the proInherit (obj) method and pass in the object to realize the inheritance of the object's attributes and methods. This method is not a built-in method, so you have to define it yourself. It is very simple:

Copy code The code is as follows:

function proInherit(obj){
function F () {}
F.prototype = obj ;
return new F();
}

Where F() is a temporary empty constructor, and then the prototype of F() is set as the parent object, but at the same time it has all the functions of its parent object by benefiting from the _proto_ link.

Chain diagram:

Class inheritance:

Copy code The code is as follows:

//Parent class constructor
function Parent( ) {
this.name = "baba";
}
//Parent class prototype method
Parent.prototype.getName = function () {
return this.name;
}

//Subclass constructor
function Child() {
this.name = "cc";
}

//Class inheritance
classInherit(Parent, Child);

//Instance
var child = new Child();
alert(child.getName()) //“baba”

Let’s take a look at the key methods of inheritance: classInherit(Parent,Child)

Copy code The code is as follows:

var classInherit = (function () {
var F = function () { }
return function (P, C) {
F.prototype = P.prototype;
C.prototype = new F();
C.prototype.constructor = C;
}
}());

Analyze this method:

    First create an empty constructor F(), and use the _proto_ attribute of its instance to build the prototype chain of the parent class and the subclass. It functions as a proxy to prevent C.prototype = P.prototype, which will modify the properties or methods together with the parent class after the subclass is instantiated. The overall use of instant functions and storage of F() in closures prevents the creation of a large number of empty constructors during multiple inheritances, thereby reducing memory consumption. The last line means that due to the prototype chain, the constructor of the instance object of C will point to P, so it is reset.

Chain diagram:

                                                                                Although this method inherits the prototype method during the instance, the attributes of the parent class cannot be inherited. The following is a

copy inheritance

, which is a supplement to class inheritance.

Copy inheritance:

Copy code The code is as follows:

//Copy inheritance
function copyInherit(p, c) {
var i,
toStr = Object.prototype.toString,
astr = "[object Array]";
c = c || {};
for (i in p) {
if (p.hasOwnProperty(i)) {
if (typeof p[i] === "object" ) {
c[i] = toStr.call(p[i]) == astr ? [] : {};
c[i] = copy(p[i], c[i]);
}
else {
c[i] = p[i];
}
}
}
return c;
}

//Rewrite Parent
function Parent() {
this.name = "pp";
this.obj= {a:1,b:2};
this.arr = [1, 2]
}
//Instance
var child = new Child();
var parent = new Parent();
copyInherit(parent, child);
alert(child.name) //"baba"
alert(child.arr) //1,2
alert(child.obj.a) //1

Analyze copyInherit(p,c)

When a value is assigned to a variable, there are two methods: passing by value and passing by reference. When the attributes in your parent object contain array types or object types, c[i] = toStr.call(p[i] ) == astr ? [] : {}; This sentence will prevent the parent object's properties from being tampered with when modifying the child object's properties.

Summary:

Class inheritance is more common because everyone is familiar with this constructor method, but it takes up a lot of memory. Prototypal inheritance takes up less memory, but it is more troublesome to clone arrays or object types. Copy inheritance is simple and widely used.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn